用Python将整数转换为两字节十六进制

4 投票
2 回答
1492 浏览
提问于 2025-04-17 21:02

我需要把一个整数(比如说,-200)转换成十六进制(FF 38),然后再转换成一个0到255之间的整数,以便通过串口发送。给我的例子是:

-200 = hex FF38 = [hex FF] [hex 38] = [255] [56]

我试过用 struct.pack('>h', -200),但返回的值不对。我也试过 hex(),但是得到的负十六进制值也是不正确的。

我不知道还应该尝试什么其他的方法。

2 个回答

0

二进制补码运算和一些字符串切片:

hex(200 - (1 << 16)) #2 bytes -> 16 bits
Out[26]: '-0xff38'

int(hex(200 - (1 << 16))[-4:-2], 16)
Out[28]: 255

int(hex(200 - (1 << 16))[-2:], 16)
Out[29]: 56

请注意,你需要小心处理非负数(也就是说,不要对它们进行二进制补码运算),还有当通过 hex 返回的字符串长度不一致时的情况。

3
>>> hex(struct.unpack('>H', struct.pack('>h', -200))[0])
'0xff38'

首先,你把-200打包成一个带符号的2字节短整型。然后你把这个数据解包成一个无符号的2字节短整型。这样你得到的结果是65336,换算成hex就是ff38


如果你需要发送0-255的整数,这样做可能更好:

>>> struct.unpack('>BB', struct.pack('>h', -200))
(255, 56)
>>> struct.unpack('>BB', struct.pack('>h', 200))
(0, 200)

这里你是把数据解包成两个无符号字符


相关的文档关于struct

撰写回答