hex and little endian

Peter Otten __peter__ at web.de
Sat Dec 13 07:15:37 EST 2003


Matteo Memelli wrote:

> Hello I'm getting in trouble....
> I'm trying to convert an hex address like 0xbfffe2f1 in little endian
> format \xf1\xe2\xff\xbf. Is there any funcion that can make this?
> Whe I try to code somethig like this:
> "\x%s\x%s\x%s\x%s" % (string1, string2, string3, string4)
> I obtain this error:
> ValueError: invalid \x escape
> 
> and if I escape the charachter "\" making something like this:
> "\\x%s\\x%s\\x%s\\x%s" % (string1, string2, string3, string4)
> It works but the resulting string is not an hex representation, I mean:
>>>> len('\xaa\xaa\xaa\xaa')
> 4
> 
>>>> len('\\xaa\\xaa\\xaa\\xaa')
> 16
> 
> Can anyone help me?
> Thank you very much in advance
> 
> Matte

Every replacement of "\xNN" in a string is done by the compiler, so one way
would be to feed your string to the compiler via eval():

>>> s = "\\x%s\\x%s" % ("AA", "BB")
>>> s
'\\xAA\\xBB' 
>>> eval("'" + s + "'")
'\xaa\xbb'
>>>

However, the cleaner approach is:

>>> import struct
>>> n = 0x00aa00bb
>>> struct.pack("i", n)
'\xbb\x00\xaa\x00'
>>> struct.pack(">i", n)
'\x00\xaa\x00\xbb'
>>> struct.pack("<i", n)
'\xbb\x00\xaa\x00'
>>>

The > and < flags are used to explicitly specify the byte order. See the
documentation http://www.python.org/doc/current/lib/module-struct.html for
details.

Peter





More information about the Python-list mailing list