簡體   English   中英

解壓縮不同類型的數據包

[英]Unpack different types of data packet

我有一個長度為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

任何想法和幫助表示贊賞。 謝謝!

問題解決了。 構造庫做得很好。 這是解決方案;

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM