使用 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 个步骤。
- 什么是输入格式?字符串还是整数?
- 输出多少位?需要转换多少位?例如,一个 14 位的数据封装在 16 位的输出中。所以它必须在计算之前移动 2 位[可能是右移或左移]。
- 你输出的是哪种数据字节序,大端还是小端?如果输出为 [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'>
我在 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 个步骤。
- 什么是输入格式?字符串还是整数?
- 输出多少位?需要转换多少位?例如,一个 14 位的数据封装在 16 位的输出中。所以它必须在计算之前移动 2 位[可能是右移或左移]。
- 你输出的是哪种数据字节序,大端还是小端?如果输出为 [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'>