Struct on on x86_64 mac os x

Tommy Grav tgrav at pha.jhu.edu
Tue Oct 20 17:51:21 EDT 2009


I have created a binary file that saves this struct from some C code:

   struct recOneData {
          char label[3][84];
          char constName[400][6];
        double timeData[3];
      long int numConst;
        double AU;
        double EMRAT;
      long int coeffPtr[12][3];
      long int DENUM;
      long int libratPtr[3];
      };

I try to read this file with python (ActiveState 2.6.3 on x86_64 Mac  
OS X 10.6.1) using the
code below the hdrData and constNData are fine, while from the  
timeData onwards there
are obvious problems. The code below works fine for a 32bit binary  
read with i386 python
2.5.2. Does anyone know what the proper format of a C double and long  
int is for a x86_64
binary?

     def read_header(cls):
         hdrData = "84s"*3
         constNData = "6s"*400
         timeData = "d"*3
         numData = "ldd"
         coeffData = "3l"*12
         denumData = "l"
         libPtrData = "lll"
         constData = "400d"
         hformat = hdrData + constNData + timeData + numData +  
coeffData + denumData + libPtrData
         header = struct.unpack(hdrData,cls.JPLeph.read(struct.calcsize 
(hdrData)))

         constN = struct.unpack(constNData,cls.JPLeph.read 
(struct.calcsize(constNData)))

         # Reading in the time data
         cls.tstart,cls.tend,cls.tstep = struct.unpack 
(timeData,cls.JPLeph.read(struct.calcsize(timeData)))

         # Read in the number of constants and the values for AU and  
emrat
         nconst, cls.au, cls.emrat = struct.unpack 
(numData,cls.JPLeph.read(struct.calcsize(numData)))

         # Reading in the coefficient pointers
         cls.coeff = struct.unpack(coeffData,cls.JPLeph.read 
(struct.calcsize(coeffData)))
         # Read in the DENUM variable and the libratPtr(3)
         (cls.denum, ) = struct.unpack(denumData,cls.JPLeph.read 
(struct.calcsize(denumData)))
         cls.libPtr = struct.unpack(libPtrData,cls.JPLeph.read 
(struct.calcsize(libPtrData)))

         if cls.denum == 405:
             cls.asize = 1018
         elif cls.denum == 200:
             cls.asize = 826
         else:
             raise ValueError("JPL ephem file is in unknown format %d"  
% (cls.denum))

Cheers
   Tommy




More information about the Python-list mailing list