728x90
반응형
구조체 형식의 데이터를 바이너리 형식으로 변환할 때 아주 유용한 함수가 struct.pack() 입니다.
주로 통신 프로토콜을 구현할 때 아주 유용하게 쓰이는데, 이 함수를 이용할 때 한 가지 주의할 점이 있습니다.
struct.pack() 함수를 이용할 때, 네이티브가 아닌 ‘<’, ‘>’, ‘=’ 및 ‘!’ 를 사용할 때는 패딩이 추가되지 않습니다.
다음 예제를 보면, 금방 이해가 되실겁니다.
>>> from struct import pack, unpack_from
>>> payload = pack('bHbHHiH', 0, 0, 0, 747, 3515, 0, 0)
>>> payload
b'\x00\x00\x00\x00\x00\x00\xeb\x02\xbb\r\x00\x00\x00\x00\x00\x00\x00\x00'
>>> len(payload)
18
>>> payload = pack('@bHbHHiH', 0, 0, 0, 747, 3515, 0, 0)
>>> payload
b'\x00\x00\x00\x00\x00\x00\xeb\x02\xbb\r\x00\x00\x00\x00\x00\x00\x00\x00'
>>> payload = pack('<bHbHHiH', 0, 0, 0, 747, 3515, 0, 0)
>>> payload
b'\x00\x00\x00\x00\xeb\x02\xbb\r\x00\x00\x00\x00\x00\x00'
>>> len(payload)
14
>>> payload = pack('=bHbHHiH', 0, 0, 0, 747, 3515, 0, 0)
>>> payload
b'\x00\x00\x00\x00\xeb\x02\xbb\r\x00\x00\x00\x00\x00\x00'
>>> payload = pack('>bHbHHiH', 0, 0, 0, 747, 3515, 0, 0)
>>> payload
b'\x00\x00\x00\x00\x02\xeb\r\xbb\x00\x00\x00\x00\x00\x00'
>>> payload = pack('!bHbHHiH', 0, 0, 0, 747, 3515, 0, 0)
>>> payload
b'\x00\x00\x00\x00\x02\xeb\r\xbb\x00\x00\x00\x00\x00\x00'
아무런 형식을 지정하지 않은 경우 네티티브(‘@’)로 인식되어, 원래 14 byte가 바이너리가 만들어져야 하는데, 18 byte 바이너리가 생성됩니다.
형식을 지정하지 않은 경우, 원치 않은 패팅으로 인하여 논리적 오류가 발생하므로, 반드시 형식을 지정하는 습관을 들여야 할 것 같습니다.
(쓸데없는 패팅으로 디버깅에 한참 걸렸다는... ㅠ.ㅠ)
(나이가 들수록 기억력이 딸리는 것이 확연해 지네요. 이전에 관련한 내용을 포스팅한 적이 있음에도... 잊어 먹고 같은 실수를 하다니... 씁슬... ㅠ.ㅠ)
참고자료
- "struct — 패킹 된 바이너리 데이터로 바이트열을 해석":https://docs.python.org/ko/3/library/struct.html
'프로그래밍 > Python' 카테고리의 다른 글
[Python] libcblas.so.3: cannot open shared object file: No such file or directory (0) | 2022.10.14 |
---|---|
[python] NumPy에서 2차원 배열에서 각 열의 평균을 구하는 방법 (0) | 2022.10.08 |
[Python] 파일 복사(copy) (0) | 2022.07.04 |
[Python] 프로세스간 데이터 공유 : Array (0) | 2022.06.16 |
[Python] CCPD 예제 동작 확인 (0) | 2022.06.05 |