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

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

我正在通过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对其进行解码时,我收到以下错误。代码:

  1. my_variable = b'A\x10Vu\x87%\x00x\x0c\xc7\x03\x01\x00\x00\x00\x00&\x00\x00\x00\x00\x00\x00\x00\x00'
  2. 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 你们不应该对它进行解码,但你们应该编写特殊的代码,将每一个值从十六进制转换成整数,并最终将其转换成带有额外值的字符串——即版本号中的点。
这里是用于从有效负载开始值的代码

  1. data = b'A\x10Vu\x87%\x00x\x0c\xc7\x03\x01\x00\x00\x00\x00&\x00\x00\x00\x00\x00\x00\x00\x00'
  2. ID = data[:6].hex()
  3. print('ID:', ID)
  4. hardware = data[6]
  5. if hardware == 1:
  6. hardware = 'NBSN95'
  7. print('hardware version:', hardware)
  8. software = data[7]
  9. print('software version (raw):', software)
  10. software = '.'.join(list(str(software)))
  11. print('software version:', software)
  12. battery = data[8:10].hex()
  13. print('battery (raw):', battery)
  14. battery = int(battery, 16)
  15. print('battery:', battery, 'mV =', battery/1000, 'V')
  16. signal = data[10]
  17. print('signal (raw):', signal)
  18. if signal == 0:
  19. signal = '-113dBm or less'
  20. elif signal == 1:
  21. signal = '-111dBm'
  22. elif 2 <= signal <= 30:
  23. signal = '-109dBm ... -53dBm'
  24. elif signal == 31:
  25. signal = '-51dBm or greater'
  26. elif signal == 99:
  27. signla = 'Not known or not detectable'
  28. print('signal:', signal)
  29. temp = data[11:13].hex()
  30. print('temperature (raw):', temp)
  31. temp = int(temp, 16)
  32. if temp & 0xFC00 == 0:
  33. temp = temp/10
  34. elif temp & 0xFC00 == 1:
  35. temp = (temp-65536)/10
  36. print('temperature:', temp, 'degree')

结果:

  1. ID: 411056758725
  2. hardware version: 0
  3. software version (raw): 120
  4. software version: 1.2.0
  5. battery (raw): 0cc7
  6. battery: 3271 mV = 3.271 V
  7. signal (raw): 3
  8. signal: -109dBm ... -53dBm
  9. temperature (raw): 0100
  10. temperature: 25.6 degree
展开查看全部
gajydyqb

gajydyqb2#

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

  1. my_variable = b'A\x10Vu\x87%\x00x\x0c\xc7\x03\x01\x00\x00\x00\x00&\x00\x00\x00\x00\x00\x00\x00\x00'
  2. # dir(my_variable)
  3. my_variable.hex
  1. <built-in method hex of bytes object at 0x00000232BDF129F0>
  1. help(my_variable.hex) # truncated
  1. Help on built-in function hex:
  2. hex(...) method of builtins.bytes instance
  3. Create a str of hexadecimal numbers from a bytes object.
  1. my_variable.hex()
  1. '41105675872500780cc7030100000000260000000000000000'
展开查看全部

相关问题