使用 python 以 2'补码格式进行字节操作

bytes manipulation in 2'complement format using python

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

我在 JAVA 中找到了一段代码,它可以按正确的顺序解析 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;
}

例如: 一 = 0010 1000 0000 0000 如果我说 a+1 等于 c[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

然后您可以单独操作字节,然后将它们打包回整数。
整数到字节数组的转换(反之亦然)因语言而异。
Post 遇到问题换一个问题。

从设备中将十六进制的 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'>