문제

파이썬 문자열을 필드로 풀리는 가장 좋은 방법은 무엇입니까?

TCP 소켓에서 수신 된 데이터가 있으며 다음과 같이 포장되어 있으며 소켓 RECV 기능의 문자열이 될 것이라고 생각합니다.

다음 형식이 있습니다

UINT8- 헤더
UINT8- 길이
UINT32 -TypeID
UINT16 -Param1
UINT16 -Param2
UINT16 -Param3
UINT16 -Param4
char [24] - 이름 문자열
UINT32- 체크섬
UINT8- 바닥 글

(또한 위와 다른 형식의 다른 패킷을 풀어야합니다)

이것들을 어떻게 포장하지 않습니까?

나는 Python을 처음 접했고 약간의 'C'를했습니다. 내가 'c'를 사용하고 있다면 아마도 구조를 사용 할 것입니다. 이것이 파이썬과 함께 갈 수있는 방법일까요?

문안 인사

엑스

도움이 되었습니까?

해결책

구조물 모듈은 형식 문자열을 기반으로 이종 데이터를 튜플에 포장하도록 설계되었습니다. 한 번에 하나의 필드를 꺼내려고하는 대신 전체 구조물을 한 번에 풀어주는 것이 더 합리적입니다. 예는 다음과 같습니다.

fields = struct.unpack('!BBI4H20sIB', data)

그런 다음 주어진 필드 (예 : 첫 번째 필드)에 액세스 할 수 있습니다.

fields[0]

또한 튜플을 사용하여 명명 된 튜플을 초기화 할 수도 있습니다. 를보세요 구조물에 대한 문서 예를 들어. 이름은 Python 2.6+에서만 제공되지만 Python 구조와 비슷하게 행동합니다. 예를 들어 Fields.header 속성으로 요소에 액세스 할 수 있습니다. 물론, 수업을 작성하여 튜플에서 정보를 캡슐화하여 약간 더 많은 작업으로이를 달성 할 수 있습니다. 위에서 보여 주듯이 항상 필드로 직접 색인 할 수 있습니다.

다른 팁

사용 struct 기준 치수

이것은 당신의 질문에 대한 답변입니다.

작동하지 않기 때문에 확실히 최선의 방법이 될 수는 없습니다. struct.unpack() 항상 튜플을 반환합니다. 그 튜플의 단일 항목을 뽑으려면 어느 쪽이든 field1 = struct.unpack('B',data[0])[0] 또는 field1, = struct.unpack('B',data[0]).

그 수정에도 불구하고, 그것은 너무 많은 타이핑, 불필요한 [start : end]의 오류 프로시, 하나 대신 10 개의 함수 호출의 비 효율성.

이름이 있으므로 Field1 또는 Field [0] 대신에 사용할 수 있습니다.

(header, length, typeID, param1, param2,
param3, param4, name_string, checksum, footer,
) = struct.unpack("!2B I 4H 24s I B", data)

이것이 이것을하는 가장 좋은 방법입니까, 아니면 더 나은 방법이 있습니까?

다른 형식이있는 문자열이있을 가능성이 높습니다.

field1 = struct.unpack ( 'b', data [0])
field2 = struct.unpack ( 'b', data [1])
field3 = struct.unpack ( '! i', data [2 : 6])
field4 = struct.unpack ( '! h', 데이터 [6 : 8])
field5 = struct.unpack ( '! h', 데이터 [8:10])
field6 = struct.unpack ( '! h', 데이터 [10:12])
field7 = struct.unpack ( '! h', 데이터 [12:14])
Field8 = struct.unpack ( '20s', 데이터 [14:38])
field9 = struct.unpack ( '! i', data [38:42])
Field10 = struct.unpack ( 'b', data [42])

문안 인사

모듈을보세요 '구조'.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top