프로그래밍/Python

[Python] struct.pack() 함수 이용시 패팅 주의하기

채윤아빠 2022. 7. 29. 20:29
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 바이너리가 생성됩니다.

형식을 지정하지 않은 경우, 원치 않은 패팅으로 인하여 논리적 오류가 발생하므로, 반드시 형식을 지정하는 습관을 들여야 할 것 같습니다.

(쓸데없는 패팅으로 디버깅에 한참 걸렸다는... ㅠ.ㅠ)

(나이가 들수록 기억력이 딸리는 것이 확연해 지네요. 이전에 관련한 내용을 포스팅한 적이 있음에도... 잊어 먹고 같은 실수를 하다니... 씁슬... ㅠ.ㅠ)

참고자료