【问题标题】:Converting bytes to signed numbers in Python在 Python 中将字节转换为有符号数
【发布时间】:2018-03-03 10:14:32
【问题描述】:

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

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

假设输入可能如下所示:
原始='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))

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

当 X 在正范围内时,此逻辑有效。预期 X 时 是负数,我得到一个正数。 我认为当它是一个签名号码时我没有正确处理“msb”。 我应该如何处理负符号数 蟒蛇?

非常感谢任何提示。

【问题讨论】:

标签: python bit-manipulation signed


【解决方案1】:

您可以使用 Python 的 struct module 将字节字符串转换为整数。它会为您处理字节顺序和符号扩展。我猜你正试图将这个 16 字节字符串解释为 8 个 2 字节有符号整数,以大端字节顺序排列。其格式字符串为'&gt;8h&gt; 字符告诉 Python 将字符串解释为大端,8 表示以下数据类型的 8,h 表示有符号短整数。

import struct
nums = struct.unpack('>8h', bin_bytes)

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

我不太确定您的数据是小端还是大端。如果是little-endian,可以在struct.unpack格式字符串中用&lt;表示。

【讨论】:

    猜你喜欢
    • 2011-10-21
    • 1970-01-01
    • 2018-04-07
    • 2012-10-30
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2023-01-29
    相关资源
    最近更新 更多