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