Python:将十六进制字符串转换为int和back

时间:2014-10-09 16:11:02

标签: python string hex data-conversion

我的python脚本通过串行线获取并发送单词。 每个字都是签名的24位值,以十六进制字符串的形式接收。 该脚本现在应该采用这些字符串并将它们转换为整数,对其进行一些计算,然后以相同的格式将它们发回。 我的问题是,如何进行此转换

Examples

Rx string -> calc int
 012345   ->  74565
 fedcba   -> -74566

calc int -> Tx string
  74565  -> 012345
 -74566  -> fedcba

如何做到这一点?

3 个答案:

答案 0 :(得分:4)

def str_to_int(s):
    i = int(s, 16)
    if i >= 2**23:
        i -= 2**24
    return i

def int_to_str(i):
    return '%06x'%((i+2**24)%2**24)

测试结果:

In [36]: str_to_int('012345')
Out[36]: 74565

In [37]: str_to_int('fedcba')
Out[37]: -74566

In [38]: int_to_str(74565)
Out[38]: '012345'

In [39]: int_to_str(-74566)
Out[39]: 'fedcba'

参考:Hex string to signed int in Python 3.2?

答案 1 :(得分:2)

(编辑:我的疏忽。请参阅Rob's answer正确覆盖负号码)

如果您只想将十六进制字符串转换为int,请执行以下操作:

>>> int('0xff', 16)
255
>>> int('0xdaad', 16)
55981

可以使用hex()功能完成相反的操作。从帮助页面:

内置函数hex的内置函数hex的帮助:

>>> help(hex)
hex(...)
    hex(number) -> string

    Return the hexadecimal representation of an integer.

       >>> hex(3735928559)
       '0xdeadbeef'

删除或添加“' 0x'应该是微不足道的。如果它在您的数据流中丢失了。 这是一个确保填充为6个字符(代表3个字节= 24位)的示例:

>>> '0x' + hex(255)[2:].rjust(6, '0')
'0x0000ff'

如果以3字节格式(24位)获取数据,则可以使用the Python docs中所述的int.to_bytes()int.from_bytes()。这是Python 3.2中的新功能。

答案 2 :(得分:1)

$ pip install bitstring

然后:

from bitstring import BitStream
s1 = BitStream('0x012345')
s1.int # 74565
s2 = BitStream(int=-74565, length=24)
s2.hex # fedcbb