如何将Python / socket读取的雷达数据(如b'\ x08 \ x00 \ x00 \ x00')解码为数字

时间:2019-05-08 09:24:16

标签: python arrays string hex bytestring

我正在开发一个Python3程序来处理雷达数据。通常,雷达将数据(十六进制数字)发送到计算机的端口,并且我使用套接字监听该端口。并使用下面的代码获取4个字节的数据。

data = connection.recv(4)
print(data)

在测试程序时,雷达发送08 00 00 01并打印程序b'\x08\x00\x00\x01'。我知道'\ x'表示字符旁边是一个十六进制数字,但是我想从中获取[08, 00, 00, 01]之类的数字或普通字符串。尝试了最明显的方法:

strData = data.decode()
print(strData.split('\x'))

失败,SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: truncated \xXX escape

如果雷达发送08 0D 00 00print(data)将打印b'\x08\r\x00\x00',情况将变得更糟,这使我意识到字符串操作无法解决此问题。

因此,将像b'\x08\x00\x00\x01'这样的字节转换成像08 00 00 01这样的数字的正确方法是什么。

字符串编码使我感到困惑-.-尽管我正在使用Python3,但Python2.7中的解决方案也可以。预先感谢。

2 个答案:

答案 0 :(得分:1)

对于这种特定情况-您有一个字节字符串,并且想要将每个字节转换为等效的整数-您可以将字节字符串直接转换为列表。

>>> bs = b'\x08\x00\x00\x01'
>>> ints = list(bs)
>>> ints
[8, 0, 0, 1]

之所以可行,是因为

  

bytes对象实际上就像不可变的整数序列

如此

  

[对于]一个字节对象b,b [0]将是一个整数,而b [0:1]将是一个长度为1的字节对象。(这与文本字符串形成对比,在文本字符串中索引和切片都会产生长度为1的字符串)

bytes类型的docs引号)。

答案 1 :(得分:0)

我想您已经获得了二进制数据。如果您确实希望十六进制表示形式为字符串,则此Answer to similar question可以为您提供帮助。

如果您想将数据解释为浮点数,则可以使用struct

import struct
x = struct.unpack('f',data)