Python 从一个4字节的十六进制数读取经度[28:0]
我收到一个4字节十六进制字符串的经度和精度:Python 从一个4字节的十六进制数读取经度[28:0],python,iot,Python,Iot,我收到一个4字节十六进制字符串的经度和精度:99054840 我试图从这个值中提取经度 规范告诉我以下内容: 位[28:0]:有符号值λ,小端格式,经度单位为°=λ÷1000000 位[31:29]:无符号值α,范围0-7,一种精度度量 我的设备实际位于经度4.7199处。所以我现在知道转换的结果应该是什么 要读取我当前执行的经度值(结果不正确),请执行以下操作: 总共是138.93。因此与4.7199(预期结果)完全不同 以下是帮助器方法 def hex_to_binary(paylo
99054840
我试图从这个值中提取经度
规范告诉我以下内容:
- 位[28:0]:有符号值λ,小端格式,经度单位为°=λ÷1000000
- 位[31:29]:无符号值α,范围0-7,一种精度度量
def hex_to_binary(payload):
scale = 16
num_of_bits = 8
binary_payload = bin(int(payload, scale))[2:].zfill(num_of_bits)
return binary_payload
def binary_to_decimal(binary):
binary1 = binary
decimal, i, n = 0, 0, 0
while(binary != 0):
dec = binary % 10
decimal = decimal + dec * pow(2, i)
binary = binary//10
i += 1
return decimal
我做错了什么?如何正确读取该值?
或者是我的设备坏了:)为了保证准确性,操作码删除了最后3位而不是前3位。此更改修复了它:
# drop the accuracy bits
long_bytes_binary[3] = long_bytes_binary[3][3:]
但计算可以简单得多:
def十六进制到经度(x):
b=字节。从十六进制(x)#将十六进制字符串转换为字节
i=int.from_bytes(b,'little')#将字节视为小端整数
返回值(i&0x1ffffff)/1e6#29位和掩码除以一百万
x='99054840'
打印(十六进制到经度(x))
4.720025
我在这里用struct
做endian交换有点作弊,但是你明白了
import struct
val = 0x99054840
val = struct.unpack('<I',struct.pack('>I',val))[0]
print(hex(val))
accuracy = (val >> 29) & 7
longitude = (val & 0x1ffffff) / 1000000
print(accuracy,longitude)
import struct
val = 0x99054840
val = struct.unpack('<I',struct.pack('>I',val))[0]
print(hex(val))
accuracy = (val >> 29) & 7
longitude = (val & 0x1ffffff) / 1000000
print(accuracy,longitude)
C:\tmp>x.py
0x40480599
2 4.720025
C:\tmp> ```