2017-12-13 14 views
0

長さ31バイト(リトルエンディアン)のUDPストリームがあります。データは1つの型だけでなく、float、intなどと混在しています。アスキーとしてデータを読み取ることができました。私はそれを16進数に変換しましたが、今ではデータを解析して正しいデータ形式に変換しようとしています。ここで、コードの関連部分を示します。異なる種類のデータパケットを展開します

受信パケット。

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形式です。このデータも16進数に変換されています。

dh = codecs.encode(data, 'hex') 
print(dh) 

>>b'ffff02003469ca4602003469ca460000000000000000002db3a242648c0fbf0000ff00d5e6' 

ここでは、16進データがあります。私はそれをリトルエンディアン形式に変換し、マップに従って展開しなければなりませんでした。以下はマップの一部です:符号なし16ビット、符号なし16ビット、単精度IEEE浮動(32ビット)、単精度IEEE浮動(32ビット)、...と続きます。 struct.unpackがうまく動作するはずなので、structクラスを読みました。私がこれまでに試した結果は得られませんでした。

c = struct.unpack("<HHff....", dh) # just for the first 4 element written above 

このエラーが発生しました。

struct.error: unpack requires a bytes object of length x 

ご迷惑をおかけして申し訳ございません。ありがとう!

答えて

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) 
関連する問題