我的python脚本通过串行线获取并发送单词。 每个字都是签名的24位值,以十六进制字符串的形式接收。 该脚本现在应该采用这些字符串并将它们转换为整数,对其进行一些计算,然后以相同的格式将它们发回。 我的问题是,如何进行此转换
Examples
Rx string -> calc int
012345 -> 74565
fedcba -> -74566
calc int -> Tx string
74565 -> 012345
-74566 -> fedcba
如何做到这一点?
答案 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'
答案 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