Python:将十六进制字符串转换为整数并反向转换

3

我的Python脚本通过串行通讯获取和发送单词。 每个单词都是作为十六进制字符串接收的有符号24位值。 现在,脚本应该将这些字符串转换为整数,进行一些计算,然后以相同的格式发送回去。 我的问题是如何进行这种转换。

Examples

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

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

这怎么做呢?


请确认:串行数据是六个字节的 '0' 填充文本,范围在 0-9a-fA-F 之间。它不是三个字节的二进制数据。这正确吗? - Robᵩ
你的任务定义是否也可以明确确认任何形式的低级串行线码协议(数据位、停止位、奇偶校验、CRC、帧结构、HDB3传输线码保护等)? - user3666197
2
@user3666197:软件的另一部分处理低级别的东西,我的部分只获取/设置6个字符的字符串。 - guo
“软件的另一部分处理低级别的东西” - 这更有意义。看起来硬件人员不太可能设计出你所描述的串行线协议。 - Robᵩ
3个回答

5
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'

参考:Python 3.2中如何将十六进制字符串转换为有符号整数?


1
你能解释一下为什么要进行减法吗?这只是为了利用负整数吗? - lucidbrot

2

(编辑:我犯了一个错误。请参见Rob的答案,以正确处理负数)

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

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

可以使用hex()函数进行反向操作。以下是帮助页面上的内容:

内置函数 hex 在模块 builtins 中的帮助信息:

>>> 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位)提供,您可以使用Python 3.2中描述的int.to_bytes()int.from_bytes()方法。有关详细信息,请参阅Python文档。请注意,这是Python 3.2中新增的功能。


1
$ pip install bitstring

然后:

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

我选择了@Robᵩ的答案,因为他的解决方案不需要安装模块。 - guo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接