使用python以2'实现格式进行字节操作

时间:2015-10-15 02:32:40

标签: java python binary offset

我在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;
}

例如: a = 0010 1000 0000 0000 如果我说+ 1等于c [offset + 1],那是正确的吗?什么是二进制的偏移,特别是与传感器有关? 非常感谢 请回答我。真的需要帮助。

2 个答案:

答案 0 :(得分:0)

您的理解是错误的,offset是一个数组索引。

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

a = 0010 1000 0000 0001

如果我们将a视为字节数组(byte []),则以c表示:

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

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

答案 1 :(得分:0)

从设备解码十六进制到十进制的2&#39;补码数。在编写代码之前必须考虑3步。

  1. 什么是输入格式?字符串还是整数?
  2. 输出中有多少位?需要转换多少位?例如,以16位输出密封的14位数据。所以它必须在计算之前移动2位[可能是右或左]。
  3. 输出中的数据端是什么类型的,可以是big endian还是little endian?如果输出为[0:7],[8:15],最好将其位置改为[15,14,13 .....,2,1,0]。然后进行移位,然后计算值。
  4. 以下代码表示十六进制字符串到十进制

        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'>