在 Python 中将字节转换为有符号数字

Vin*_*Yau 5 python signed bit-manipulation

我在 Python 中遇到了一个问题,我想我不明白 Python 中如何处理带符号的数字。我的逻辑在 Java 中工作,其中所有内容都经过签名,因此需要 Python 中的一些帮助。

我有一些以十六进制编码的字节,我需要对它们进行解码并将它们解释为数字。协议已定义。

假设输入可能如下所示:
raw = '016402570389FFCF008F1205DB2206CA' 我像这样解码:

bin_bytes = binascii.a2b_hex(raw)
lsb = bin_bytes[5] & 0xff
msb = bin_bytes[6] << 8
aNumber = int(lsb | msb)
print("     X: " + str(aNumber / 4000.0))
Run Code Online (Sandbox Code Playgroud)

除以 4000.0 后,X 的范围可以是 -0.000025 到 +0.25。

当 X 在正范围内时,此逻辑有效。当 X 预计为负数时,我会返回一个正数。我认为当“msb”是有符号数字时,我没有正确处理它。我应该如何处理Python中的负符号数?

非常感谢任何提示。

mtr*_*trw 6

您可以使用Python的struct模块将字节字符串转换为整数。它会为您处理字节序和符号扩展。我猜您正在尝试将这个 16 字节字符串解释为 8 个 2 字节有符号整数,采用大端字节顺序。其格式字符串是'>8h. 该>字符告诉 Python 将字符串解释为大端字节序,8表示以下数据类型的 8,并且h表示有符号短整数。

import struct
nums = struct.unpack('>8h', bin_bytes)
Run Code Online (Sandbox Code Playgroud)

现在nums是一个可以进一步处理的整数元组。

我不太确定您的数据是小端还是大端。如果是小端字节序,可以在格式字符串<中使用 来指示struct.unpack