Reputation:
I'm trying to convert a float into binary.
I'm using the module struct. For instance, with the value of 3.5, when I execute this line :
struct.pack('>f',3.5)
I get this :
b'@`\x00\x00'
I suppose the two x00 x00 represent hexadecimal values for each bytes used but what about the b and '@` ?
Upvotes: 1
Views: 2828
Reputation: 363253
The format string '>f'
means
'f'
IEEE 754 binary32 (4 bytes, like a C float)
'>'
big-endian byte order, standard size
That's documented here. The characters @
and `
are just part of your numeric data (3.5) when represented as ASCII. It's probably more helpful to look at these 4 bytes represented as binary:
>>> format(ord('@'), '08b')
'01000000'
>>> format(ord('`'), '08b')
'01100000'
>>> format(ord('\x00'), '08b')
'00000000'
So concatenated as a 32-bit float, that's has a binary representation like this:
>>> ''.join(format(x, '08b') for x in b'@`\x00\x00')
'01000000011000000000000000000000'
To convert the binary representation back to float by hand, read about single-precision floating-point format here, and split it up into components instead of bytes. This is sign bit, exponent (8 bit unsigned int, offset-encoded), and fraction (23 bits):
0 10000000 11000000000000000000000
The exponent here is just 1, because that representation offset by 127:
>>> int('10000000', 2) - 127
1
The fractional part is like 1.112, i.e.
>>> (2**0 + 2**-1 + 2**-2)*2
3.5
With a positive sign bit (-1)0 = 1, and an exponent 1, that's the number 3.5 (and it happens to be one of the numbers which can be represented exactly as a float).
Upvotes: 1
Reputation: 1374
There's no problem - the b''
literal is already binary bytes type (an old tradition, since 2.x).
>>> struct.pack('>f',3.5)
b'@`\x00\x00'
>>> a = struct.pack('>f',3.5)
>>> type(a)
<class 'bytes'>
Upvotes: 0