【问题标题】:bytes manipulation in 2'complement format using python使用python以2'补码格式进行字节操作
【发布时间】:2015-10-15 02:32:39
【问题描述】:

我在 2' 补码中加载了 14 位带符号二进制(以 16 位密封),通过 BLE(蓝牙低功耗)从传感器收集这些数据。我想将其转换为十进制。

我在 JAVA 中找到了一个 sn-p 代码,它可以按正确的顺序解析 14 位二进制文​​件。但我是python编码的新手。你能解释一下什么是 c[offset+1] 和 c[offset] & 0xFF 吗?以及如何用python表达?

private static Integer shortSignedAtOffset(byte[] c, int offset) {
    Integer lowerByte = (int) c[offset] & 0xFF; 
    Integer upperByte = (int) c[offset+1]; // // Interpret MSB as signed
    return (upperByte << 8) + lowerByte;
}

例如: a = 0010 1000 0000 0000 如果我说 a+1 等于 c[offset+1],对吗?二进制中的偏移量在做什么,尤其是与传感器相关? 多谢 请回答我。真的需要帮助。

【问题讨论】:

  • 嗨,专业人士,让我发烧吧。如果您不想回答,请让其他人帮助我。

标签: java python binary offset


【解决方案1】:

你的理解错了,offset是数组索引。

a=0x2A01,这就是a在内存中的存储方式:

a = 0010 1000 0000 0001

如果我们将a 视为一个字节数组(byte []),记为c

c[0] = 0x2
c[1] = 0xA
c[2] = 0x0
c[3] = 0x1

然后您可以单独操作字节,然后将它们打包回整数。
整数到字节数组的转换(反之亦然)因语言而异。
如果您遇到问题,请发布不同的问题。

【讨论】:

  • 感谢您的回答。我仍然很困惑。那么偏移量在这里做什么? lowerByte = (int) c[offset] & 0xFF;是不是找了个专门的地方来做“&”的工作?所以它会像这样:c[1] & 0xFF?为什么会出现两个FF(一个字节)?但是无论如何,这个 Java 的 sn-ps 是不正确的。
【解决方案2】:

从设备将十六进制的 2' 补码解码为十进制。在编写代码之前必须考虑 3 步。

  1. 什么是输入格式?字符串还是整数?
  2. 输出多少位?需要转换多少位?例如,一个 14 位数据密封在 16 位输出中。所以它必须在计算之前移动 2 位[可能是向右或向左]。
  3. 您的输出中的数据字节序是大字节序还是小字节序?如果输出为 [0:7],[8:15],最好将其位置更改为 [15,14,13.....,2,1,0]。然后进行移位,然后计算值。

以下代码将十六进制字符串表示为十进制

    def twocompbinstr(valstr, bits):
        if type(valstr) is str:
            valstr = int(valstr, 16)  #expect hex in string format
        if (valstr & (1 << (bits - 1))) != 0:
            valstr = valstr - (1 << bits)
        return valstr

测试代码:

    h = '3aff' # 0011 1010 1111 1111
    # 14bits 2'complement integer is sealed in 16bit format.
    e = twocompbinstr(h,14)
    print e, type(e)

    output:
    -1281 <type 'int'>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多