解码tcp连接的有效负载:“utf-8”编解码器无法解码位置4:无效起始字节中的字节0x87

jq6vz3qz  于 2021-09-08  发布在  Java
关注(0)|答案(2)|浏览(399)

我正在通过tcp从传感器节点发送到我的tcp服务器。接收到的原始数据如下所示:
b'a\x10vu\x87%\x00x\x0c\xc7\x03\x01\x00\x00\x00\x00\x00和\x00\x00\x00\x00\x00\x00\x00
当尝试使用utf-8对其进行解码时,我收到以下错误。代码:

my_variable = b'A\x10Vu\x87%\x00x\x0c\xc7\x03\x01\x00\x00\x00\x00&\x00\x00\x00\x00\x00\x00\x00\x00'

print(my_variable.decode('utf-8'))

错误:
print(my_variable.decode('utf-8'))unicodedecodeerror:'utf-8'编解码器无法解码位置4中的字节0x87:无效的起始字节
所以问题是负载显然包含非ascii格式的字符。
我怎样才能把这个有效载荷解码成人类可读的东西?
有效负载描述可在第32页的此处找到。p20显示了一个tcp连接示例,但没有对有效负载进行解码。

yi0zb3m4

yi0zb3m41#

以文档为基础是不正确的 human readable 你们不应该对它进行解码,但你们应该编写特殊的代码,将每一个值从十六进制转换成整数,并最终将其转换成带有额外值的字符串——即版本号中的点。
这里是用于从有效负载开始值的代码

data = b'A\x10Vu\x87%\x00x\x0c\xc7\x03\x01\x00\x00\x00\x00&\x00\x00\x00\x00\x00\x00\x00\x00'

ID = data[:6].hex()
print('ID:', ID)

hardware = data[6]
if hardware == 1:
    hardware = 'NBSN95'
print('hardware version:', hardware)

software = data[7]
print('software version (raw):', software)

software = '.'.join(list(str(software)))
print('software version:', software)

battery = data[8:10].hex()
print('battery (raw):', battery)

battery = int(battery, 16)
print('battery:', battery, 'mV =', battery/1000, 'V')

signal = data[10]
print('signal (raw):', signal)    

if signal == 0:
    signal = '-113dBm or less'
elif signal == 1:
    signal = '-111dBm'
elif 2 <= signal <= 30:
    signal = '-109dBm ... -53dBm'
elif signal == 31:     
    signal = '-51dBm or greater'
elif signal == 99:
    signla = 'Not known or not detectable'
print('signal:', signal)    

temp = data[11:13].hex()    
print('temperature (raw):', temp)

temp = int(temp, 16)
if temp & 0xFC00 == 0:
    temp = temp/10
elif temp & 0xFC00 == 1:
    temp = (temp-65536)/10
print('temperature:', temp, 'degree')

结果:

ID: 411056758725
hardware version: 0
software version (raw): 120
software version: 1.2.0
battery (raw): 0cc7
battery: 3271 mV = 3.271 V
signal (raw): 3
signal: -109dBm ... -53dBm
temperature (raw): 0100
temperature: 25.6 degree
gajydyqb

gajydyqb2#

您可以在python提示符中找到答案。事实上,我是用 dir(my_variable) :

my_variable = b'A\x10Vu\x87%\x00x\x0c\xc7\x03\x01\x00\x00\x00\x00&\x00\x00\x00\x00\x00\x00\x00\x00'

# dir(my_variable)

my_variable.hex
<built-in method hex of bytes object at 0x00000232BDF129F0>
help(my_variable.hex)            # truncated
Help on built-in function hex:

hex(...) method of builtins.bytes instance
    Create a str of hexadecimal numbers from a bytes object.
my_variable.hex()
'41105675872500780cc7030100000000260000000000000000'

相关问题