Reading a binary file

Sorin Marti mas at semafor.ch
Thu Jun 26 10:14:58 EDT 2003


Peter Hansen wrote:
> Sorin Marti wrote:
> 
>>I am quite new to python and very new to this list.
>>
>>I've got following problem. I have a binary file which contains
>>information I should read. I can open the file with
> 
> [snip]
> 
> It would really be best if you could describe in more detail
> what you are trying to do with this data.  Bytes are bytes,
> and things like hex and binary are just different _representations_
> of bytes, so whether you want binary, hex, decimal, or something
> else depends entirely on the use to which you will put the info.
> 

Hi Peter,

Ok I'll try to give more details. I have a Siemens SPS. With an SPS you 
can controll machines such as pumps or motors or anything else. To 
controll you have to set Variables. If you want to see which state these 
variables have you can get a file via ftp where these values are stored. 
This is what I have done. Now I have a file (called cpu1db2.dat) and 
this file has a length of 16 bytes.

Byte Number/Length   Type       Hex-Value
----------------------------------------------------------------
Byte              1: Boolean:   01    (which is true, 00 would be false)
Byte              2: Byte:      11   (This data type is called byte)
Byte              3: Char:      50    (Which should be a "P")
Byte            4,5: Word       00 00
Byte            6,7: Integer    22 04
Byte      8,9,10,11: DoubleWord D2 00 00 BB
Byte 12,13,14,15,16: Real       BB 42 C8 00 00


So I have written a python class which makes a connection to the 
ftp-server (on the SPS) and gets the file.
Then there is a function where you can call a value with a startbyte and 
an endbyte. You also have to specify the type. That means you can call
getValue('REAL',12,16) and you should get back 100 because if you have 
the binary value of 'BB 42 C8 00 00' is 01000010110010000000000000000000 
, first digit is the Sign (which is + or - ), next 8 digits are the 
exponent, in this case 10000101 = 133dec. Now you take away 127 from 133 
then you get six, thats the exponent. The rest 
(110010000000000000000000) has a hex value of C80000 this is 13107200 
decimal. Now you have to multiply 13107200 with 2^6 and 2^-23 and you 
get (tataaaaaa!): 100!

The different data types need different calculations, that's why I asked 
a few things about changing the representation because I only can do 
some things in binary mode or hex mode.

Cheers
    Sorin Marti






More information about the Python-list mailing list