Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   Help need with converting Hex string to IEEE format float (http://www.velocityreviews.com/forums/t339236-help-need-with-converting-hex-string-to-ieee-format-float.html)

 i_vincent@hotmail.com 12-14-2004 03:36 PM

Help need with converting Hex string to IEEE format float

Hi all,

Newbie Python programmer here, so please be patient. I have spent all
day googling for an answer to my problem, but everything I try fails to
work (or works from the Interpreter with a set value but not from my
code with dynamic values).

Okay, here is the general gist of the problem. I am using Python to
parse an output file (from a MAK Logger but that is not really
important). Now I have some data that is contained on a line in this
file like:

80 00 00 00

Each of these numbers is a Hex byte making up a four byte (32 bit
Big-Endian) IEEE float. I have read this data into Python using
readlines and then line.split(). This gives me:

['80', '00', '00', '00']

I am then reading these in as:

wib[0] + wib[1] + wib[2] + wib[3] = 8000000 as a string

Now this is the point where I get stuck, I have tried various ways of
implementing the pack/unpack methods of the struct module but with no
luck.

One example I tried was:

wibble = struct.unpack("f", struct.pack("l", long(conv_str, 16)))
OverflowError: long int too large to convert to int

If I follow the examples I have found on the net using a set value of
0x80000000 in them, everything works fine from the interpreter line.

Arrrggggghhhh.

Everything has worked really easily up this point but I am now stuck
completely, I would be grateful for any help people can offer.
Regards

Ian Vincent

 Fredrik Lundh 12-14-2004 03:57 PM

Re: Help need with converting Hex string to IEEE format float

<i_vincent@hotmail.com> wrote:

> Newbie Python programmer here, so please be patient. I have spent all
> day googling for an answer to my problem, but everything I try fails to
> work (or works from the Interpreter with a set value but not from my
> code with dynamic values).
>
> Okay, here is the general gist of the problem. I am using Python to
> parse an output file (from a MAK Logger but that is not really
> important). Now I have some data that is contained on a line in this
> file like:
>
> 80 00 00 00
>
> Each of these numbers is a Hex byte making up a four byte (32 bit
> Big-Endian) IEEE float. I have read this data into Python using
> readlines and then line.split(). This gives me:
>
> ['80', '00', '00', '00']

# convert to byte string
import struct
s = "".join([chr(int(c, 16)) for c in x])
v = struct.unpack("!f", s)

or

# convert to byte string, via the array module
import array, struct
a = array.array("B", [int(c, 16) for c in x])
v = struct.unpack("!f", )

</F>

 Fredrik Lundh 12-14-2004 04:07 PM

Re: Help need with converting Hex string to IEEE format float

> # convert to byte string, via the array module
> import array, struct
> a = array.array("B", [int(c, 16) for c in x])
> v = struct.unpack("!f", )

eh? should be:

# convert to byte string, via the array module
import array, struct
a = array.array("B", [int(c, 16) for c in x])
v = struct.unpack("!f", a)

</F>

 Max M 12-14-2004 04:18 PM

Re: Help need with converting Hex string to IEEE format float

i_vincent@hotmail.com wrote:

> Each of these numbers is a Hex byte making up a four byte (32 bit
> Big-Endian) IEEE float. I have read this data into Python using
> readlines and then line.split(). This gives me:
>
> ['80', '00', '00', '00']

Oh, programmers loves this kind stuff. You should get tons of answers.

##
st = '80 00 00 00'

import binascii
import struct

s = ''.join([binascii.a2b_hex(s) for s in st.split()])
v = struct.unpack("f", s)[0]
print v
##

regards Max M

--

hilsen/regards Max M, Denmark

http://www.mxm.dk/

 Fredrik Lundh 12-14-2004 04:32 PM

Re: Help need with converting Hex string to IEEE format float

Max M wrote:

> Oh, programmers loves this kind stuff. You should get tons of answers.

data = '80 00 00 00'

import Image
v = Image.fromstring("F", (1, 1), data, "hex", "F;32BF").getpixel((0, 0))

</F>

 Christos TZOTZIOY Georgiou 12-15-2004 09:04 AM

Re: Help need with converting Hex string to IEEE format float

On Tue, 14 Dec 2004 16:57:02 +0100, rumours say that "Fredrik Lundh"
<fredrik@pythonware.com> might have written:

>
> # convert to byte string
> import struct
> s = "".join([chr(int(c, 16)) for c in x])
> v = struct.unpack("!f", s)

I think that the third line in the snippet above could also be:

s = "".join(x).decode("hex")

I am not sure I remember in which version of Python the hex codec was
added, but it is handy.
--
TZOTZIOY, I speak England very best.
"Be strict when sending and tolerant when receiving." (from RFC1958)
I really should keep that in mind when talking with people, actually...

 Peter Hansen 12-15-2004 03:29 PM

Re: Help need with converting Hex string to IEEE format float

Christos TZOTZIOY Georgiou wrote:
> s = "".join(x).decode("hex")
>
> I am not sure I remember in which version of Python the hex codec was
> added, but it is handy.

Of course, binascii could do this since 2.0 or so, but not
having to import another module *is* nice:

>>> 'ff12'.decode('hex')

'\xff\x12'

>>> import binascii
>>> binascii.unhexlify('ff12')

'\xff\x12'

Thanks for pointing it out, Christos.

 Richard Brodie 12-16-2004 11:08 AM

Re: Help need with converting Hex string to IEEE format float

<i_vincent@hotmail.com> wrote in message

> One example I tried was:
>
> wibble = struct.unpack("f", struct.pack("l", long(conv_str, 16)))
> OverflowError: long int too large to convert to int

You can't fit 0x80000000L into a signed 32-bit integer, use 'L' for
an unsigned one.

> If I follow the examples I have found on the net using a set value of
> 0x80000000 in them, everything works fine from the interpreter line.

This depends on the Python version: before 2.4 0x80000000
corresponds to the bit pattern you expect but will be negative.
That's why it's happy as a signed 32-bit integer.

>>> 0x80000000 == 0x80000000L

<interactive input>:1: FutureWarning: hex/oct constants > sys.maxint
will return positive values in Python 2.4 and up
....
False

 Ian Vincent 12-17-2004 11:15 AM

Re: Help need with converting Hex string to IEEE format float

Max M <maxm@mxm.dk> wrote in news:41bf121e\$0\$280
>
> ##
> st = '80 00 00 00'
>
> import binascii
> import struct
>
> s = ''.join([binascii.a2b_hex(s) for s in st.split()])
> v = struct.unpack("f", s)[0]
> print v
> ##

This one worked great for what I was trying to do.

Thanks to everybody for your help.

TTFN

Ian

 All times are GMT. The time now is 04:57 PM.