我正在开发一个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 00
,print(data)
将打印b'\x08\r\x00\x00'
,情况将变得更糟,这使我意识到字符串操作无法解决此问题。
因此,将像b'\x08\x00\x00\x01'
这样的字节转换成像08 00 00 01
这样的数字的正确方法是什么。
字符串编码使我感到困惑-.-尽管我正在使用Python3,但Python2.7中的解决方案也可以。预先感谢。
答案 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)