解压缩不同类型的数据包

时间:2017-12-13 11:16:17

标签: python-3.x udp unpack

我有一个长度为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

任何想法和帮助表示赞赏。谢谢!

1 个答案:

答案 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)