如何在消息中找到大端键?
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
之后需要缩进)。该算法似乎与您的任务无关(但我可能遗漏了一些细节)。
我正在尝试使用代理从 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
之后需要缩进)。该算法似乎与您的任务无关(但我可能遗漏了一些细节)。