我有一个长度为31个字节的UDP流(小端)。数据不仅是一种类型,它与float,int等混合。我已经实现了以ascii读取数据。我已将其转换为十六进制,现在我正在尝试解析数据并将其转换为正确的数据格式。这是代码的相关部分;
接收数据包;
import socket
port = your_port
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(("", port))
print("waiting on port:", port)
#while 1:
data, addr = s.recvfrom(1024)
print(data)
>>b'\xff\xff\x02\x004i\xcaF\x02\x004i\xcaF\x00\x00\x00\x00\x00\x00\x00\x00\x00-\xb3\xa2Bd\x8c\x0f\xbf\x00\x00\xff\x00\xd5\xe6'
此数据采用ascii格式,因此我将其转换为十六进制格式;
dh = codecs.encode(data, 'hex')
print(dh)
>>b'ffff02003469ca4602003469ca460000000000000000002db3a242648c0fbf0000ff00d5e6'
现在,我有十六进制数据。我必须将它转换为小端格式,并根据地图解压缩后。以下是映射的一部分:无符号16位,无符号16位,单精度IEEE浮点(32位),单精度IEEE浮点(32位),......等等。 我已经阅读了struct类,因为我理解struct.unpack应该可以工作。到目前为止我已经尝试过但无法得到任何结果,
c = struct.unpack("<HHff....", dh) # just for the first 4 element written above
收到此错误;
struct.error: unpack requires a bytes object of length x
任何想法和帮助表示赞赏。谢谢!
答案 0 :(得分:0)
问题解决了。 construct库正在做得很好。 这是解决方案;
import socket
import struct
from construct import *
port = your port
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(("", port))
print("waiting on port:", port)
data, addr = s.recvfrom(1024)
c = Struct("a"/Int16ul, "b"/Int16ul, "c"/Float32l, "d"/Float32l,....)
x = c.parse(data)
print(x)