Python 从一个4字节的十六进制数读取经度[28:0]

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

我收到一个4字节十六进制字符串的经度和精度:
99054840
我试图从这个值中提取经度

规范告诉我以下内容:

  • 位[28:0]:有符号值λ,小端格式,经度单位为°=λ÷1000000

  • 位[31:29]:无符号值α,范围0-7,一种精度度量

我的设备实际位于经度4.7199处。所以我现在知道转换的结果应该是什么

要读取我当前执行的经度值(结果不正确),请执行以下操作:

总共是138.93。因此与4.7199(预期结果)完全不同

以下是帮助器方法

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