interpret 4 byte as 32-bit float (IEEE-754)

Scott David Daniels Scott.Daniels at Acm.Org
Sat Jan 15 14:00:36 EST 2005

G.Franzkowiak wrote:
> Scott David Daniels schrieb:
>> franzkowiak wrote:
>>> I've read some bytes from a file and just now I can't interpret 4 
>>> bytes in this dates like a real value.  An extract from my program:
>>> def l32(c):
>>>     return ord(c[0]) + (ord(c[1])<<8) + (ord(c[2])<<16) +  
>>> (ord(c[3])<<24)
>>> ...
>>> value = l32(      <---  3F 8C CC CD  should be 1.11
>> OK, here's the skinny (I used blocks & views to get the answer):
>> import struct
>> bytes = ''.join(chr(int(txt, 16)) for txt in '3F 8C CC CD'.split())
>> struct.unpack('>f', bytes)
>> I was suspicious of that first byte, thought it might be an exponent,
>> since it seemed to have too many on bits in a row to be part of 1.11.
>> -Scott David Daniels
>> Scott.Daniels at Acm.Org
> Ok, I the string exist with "mystr =" and the solution for 
> this case is in your line "struct.unpack('>f', bytes)"
> But what can I do when I want the interpret the content from the Integer 
> myInt  (*myInt = 0x3F8CCCCD) like 4-byte-real ?
> This was stored with an othes system in a binary file to
> CD CC 8C 3F and now is it in python in value. The conversion is not 
> possible. It's right... one of this bytes is an exponent.
> I want copy the memory content from the "value address" to "myReal 
> address" and use print "%f" %myReal.
> Is myReal then the right format ?
> What can I do with python, in FORTH is it simple
> ( >f f. )
> gf
If you really want to do this kind of byte fiddling:

     from block import Block, View
     b = Block(4) # enough space for one float (more is fine)
     iv = View('i', b) # getting to it as an integer
     fv = View('f', b) # same memory as floating point
     iv[0] = 0x3F8CCCCD # Here is a sample just using the integer
     print fv[0]

On an Intel/Amd/Generic "PC" machine, you should get 1.1

-Scott David Daniels
Scott.Daniels at Acm.Org

More information about the Python-list mailing list