Procedures Details | <Prev Next> |
When a line list is produced with PrintLevel = Binary the resulting binary format is
designed to be quick to read by external programs. (See the
information about the Command Line Version
for a common way to do this) It has the same content as the other
linelist formats, and consists of a sequence of lines/records:
The line/record is a simple sequence of fields, with each field
headed by a byte identifying the type:
Header
Byte |
Field
Contents |
< 200 |
String field; header byte gives length. A one character
string with a single character 10 (new line character)
implies end of line/record. |
200+sizeof(int) (Normally 204) |
Integer. Note that quantum numbers are represented as
integers with twice the true value. |
216+sizeof(double) (Normally 224) |
Floating point value |
216+2*sizeof(double) (Normally 232) |
Complex number, with real part first. |
The integer and floating point values are in the format naive to
the platform, so the binary files are not necessarily
transportable between machines. However all current versions
(except the obsolete PowerPC version) produce compatible files.
A simple C program that dumps the binary file as text is shown below:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifdef _Windows
#include <io.h>
#else
#include <unistd.h>
#define O_BINARY 0
#endif
#include <fcntl.h>
#include <stdlib.h>
int main(int argc, char*argv[])
{
int fd = open(argv[1],O_RDONLY | O_BINARY); /* Open file */
struct stat sbuf;
unsigned char *buffer, *p;
fstat(fd,&sbuf); /* Find it's size */
buffer = malloc(sbuf.st_size);
read(fd, buffer, sbuf.st_size); /* Read it into memory */
p = buffer;
while ( p < buffer + sbuf.st_size ) { /* Loop over entries */
if ( (*p > 0) && (*p < 200) ) { /* Is it a string? */
if ( (*p == 1) && (p[1] == 10) )
printf("\n"); /* End of line marker */
else {
fwrite(p+1, 1, *p, stdout); /* Normal string */
printf(" ");
}
p += *p + 1; /* Skip string */
} else if ( *p < 216 ) {
printf("%d ",*(int *)(p+1)); /* Integer */
p += 1 + sizeof(int);
} else if ( *p < 232 ) {
printf("%g ",*(double *)(p+1)); /* Floating point value */
p += 1 + sizeof(double);
} else if ( *p = 232 ) {
printf("%g ",*(double *)(p+1)); /* Real part */
p += 1 + sizeof(double);
printf("%g ",*(double *)(p)); /* Imaginary part */
p += sizeof(double);
} else {
printf("\nUnknown Field:%d\n",*p);
return 1;
}
}
return 0;
}