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