長さ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
ご迷惑をおかけして申し訳ございません。ありがとう!