Splitting a float into bytes:

M

Michael Yanowitz

Hello:

For some reason I can't figure out how to split
a 4-byte (for instance) float number (such as 3.14159265359)
into its 4-bytes so I can send it via a socket to another
computer.
For integers, it is easy, I can get the 4 bytes by anding like:
byte1 = int_val & 0x000000FF
byte2 = int_val & 0x0000FF00
byte3 = int_val & 0x00FF0000
byte4 = int_val & 0xFF000000
But if I try to do that with floats I get:Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: unsupported operand type(s) for &: 'float' and 'int'

Is there some easy way to get what the bytes of the float are?

Thanks in advance:
Michael Yanowitz
 
S

Simon Forman

Michael said:
Hello:

For some reason I can't figure out how to split
a 4-byte (for instance) float number (such as 3.14159265359)
into its 4-bytes so I can send it via a socket to another
computer.
For integers, it is easy, I can get the 4 bytes by anding like:
byte1 = int_val & 0x000000FF
byte2 = int_val & 0x0000FF00
byte3 = int_val & 0x00FF0000
byte4 = int_val & 0xFF000000
But if I try to do that with floats I get:
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: unsupported operand type(s) for &: 'float' and 'int'

Is there some easy way to get what the bytes of the float are?

Thanks in advance:
Michael Yanowitz

The struct module. (It also works for ints. ;-) )

http://docs.python.org/lib/module-struct.html


HTH,
~Simon
 
S

Simon Forman

Michael said:
-----Original Message-----
From: [email protected]
[mailto:p[email protected]]On Behalf
Of Simon Forman
Sent: Wednesday, July 26, 2006 2:56 PM
To: (e-mail address removed)
Subject: Re: Splitting a float into bytes:


Michael said:
Hello:

For some reason I can't figure out how to split
a 4-byte (for instance) float number (such as 3.14159265359)
into its 4-bytes so I can send it via a socket to another
computer.
For integers, it is easy, I can get the 4 bytes by anding like:
byte1 = int_val & 0x000000FF
byte2 = int_val & 0x0000FF00
byte3 = int_val & 0x00FF0000
byte4 = int_val & 0xFF000000
But if I try to do that with floats I get:
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: unsupported operand type(s) for &: 'float' and 'int'

Is there some easy way to get what the bytes of the float are?

Thanks in advance:
Michael Yanowitz

The struct module. (It also works for ints. ;-) )

http://docs.python.org/lib/module-struct.html


HTH,
~Simon

Thanks, but maybe I am missing something.
If I use pack, doesn't it have to be unpacked at the other end
to make sense? The data will be picked up on some other computer
by some other application probably written in C or C++. Would
it have to be rewritten to unpack the data?

Thanks in advance:
Michael Yanowitz

It says in the docs "This module performs conversions between Python
values and C structs represented as Python strings." This means, to
me, that the packed data will be in the format that C (and C++ I would
assume) uses.

You might have to mind the endian-ness if you're transferring data
between different architectures, but struct includes format specifiers
for this.

Have fun,
~Simon
 
J

John Machin

Michael said:
Hello:

For some reason I can't figure out how to split
a 4-byte (for instance) float number (such as 3.14159265359)
into its 4-bytes so I can send it via a socket to another
computer.
For integers, it is easy, I can get the 4 bytes by anding like:
byte1 = int_val & 0x000000FF
byte2 = int_val & 0x0000FF00
byte3 = int_val & 0x00FF0000
byte4 = int_val & 0xFF000000

Errrmmm ... I think you need the right shift operator e.g.
byte4 = (int_val & 0xFF000000) >> 24
but assert 0 <= byte4 <= 255 may fail under some circumstances
so (better):
byte4 = (int_val >> 24) & 0xFF
# absolutely guaranteed to pass that assertion

BUT why muck around with all that when you can use struct.pack???
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,756
Messages
2,569,540
Members
45,024
Latest member
ARDU_PROgrammER

Latest Threads

Top