pythonnumpybitstring

How to read a float from a raw binary file written with numpy's tofile()


I am writing a float32 to a file with numpy's tofile().

float_num = float32(3.4353)
float_num.tofile('float_test.bin')

It can be read with numpy's fromfile(), however that doesn't suit my needs and I have to read it as a raw binary with the help of the bitstring module.

So I do the following:

my_file = open('float_test.bin', 'rb')
raw_data = ConstBitStream(my_file)
float_num_ = raw_data.readlist('float:32')

print float_num
print float_num_

Output:

3.4353
-5.56134659129e+32

What could be the cause? The second output should also be 3.4353 or close.


Solution

  • The problem is that numpy's float32 is stored as little endian and bitstrings default implementation is bigendian. The solution is to specify little endian as the data type.

    my_file = open('float_test.bin', 'rb')
    raw_data = ConstBitStream(my_file)
    float_num_ = raw_data.readlist('floatle:32')
    
    print float_num
    print float_num_
    

    Output:

    3.4353
    3.43530011177
    

    Reference on bitstring datatypes, here.