2017-12-13 6 views
0

길이가 31 바이트 (리틀 엔디안) 인 UDP 스트림이 있습니다. 데이터는 한 가지 유형 일뿐만 아니라 float, int 등과 혼합되어 있습니다. ASCII로 데이터를 읽으려고 시도했습니다. 나는 그것을 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 형식이므로 너무 길게 변환됩니다.

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)