如何在消息中找到大端键?

How can I find the big endian key in a message?

我正在尝试使用代理从 ESP32 读取二进制消息;我写了一个植物脚本,我订阅了这个主题。我实际收到的消息是:

b'\x00\x00\x00?'

这是一条浮点二进制小字节序消息,但我没有解码它的密钥。有没有办法根据这些数据找到解码密钥? 这是我的 python 代码:

    import paho.mqtt.client as mqtt


def on_connect1(client1,  userdata1, flags1, rc1):
    
    client1.subscribe("ESP32DevKit123/mytopic")

def on_message1(client1, userdata1, msg1):
    print(msg1.topic+" "+ "TESTENZA: "+str(msg1.payload))

client1 = mqtt.Client()

client1.username_pw_set(username="myuser",password="mypassword")

client1.on_connect = on_connect1

client1.on_message = on_message1

client1.connect("linkclient", portnumber, 60)


def twosComplement_hex(hexval):
    bits = 16 # Number of bits in a hexadecimal number format
    on_message1 = int(hexval, bits)
    if on_message1 & (1 << (bits-1)):
    on_message1 -= 1 << bits
    return on_message1


client1.loop_forever()

它还在行 on_message1 -= 1 << bits; 中给我一个错误;错误说:预期的预期块 pylance。有什么解决办法吗?

您提供的数据是 b'\x00\x00\x00?' - 我假设这是 0000003f(请输出带 msg1.payload.hex() 的十六进制)。

我还假设“float binary little endian”是指大端浮点 (IEE754) - 请注意,这与您使用的算法不匹配(twos compliment). Plugging this input into an online tool 表示预期结果(“Float - Big Endian (ABCD)”)是 8.82818e-44(值得使用此工具检查;有时编码可能不是您认为的那样!)。

让我们使用 python 解压缩(有关更多信息,请参阅 struct 文档):

>>> from struct import unpack
>>> unpack('>f', b'\x00\x00\x00\x3f')[0]
8.828180325246348e-44

备注:

  • [0] 在那里是因为 unpack returns 一个数组(您可以从输入中解压多个项目)
  • >f - > 表示 big-endian 而 f 浮点数(标准大小 = 4 字节)

您的原始代码给出错误“Expected intended block”的原因是 on_message1 -= 1 << bits 行中缺少缩进(因为它跟在 if 之后需要缩进)。该算法似乎与您的任务无关(但我可能遗漏了一些细节)。