Python

[Python] pack, unpack 함수

shvtr159 2022. 10. 20. 15:18

C, C++ 에는 int, float와 같이 자료형을 명시하지만 python에서는 이런 게 없어 C/C++과 같이 사용할 때 헷갈리는 부분이 있습니다. 이 중에서 C/C++의 구조를 python에서 사용할 수 있도록 하는 함수에 대해 알아봅니다.

파이썬의 struct 모듈에는 pack과 unpack이라는 함수가 있습니다.

 

C언어에서 %d, %f와 같은 방식으로 변수형 및 그 크기를 알려준 것과 같이 python에서도 위 함수를 사용하면 C와 같이 사용 가능한 형태로 pack, unpack할 수 있습니다. 그 포맷은 다음과 같습니다.

pack에 사용하는 변수형 format

 

 

코드를 통해 그 예를 한번 보겠습니다.

>>> from struct import *
>>> pack('hhl', 1, 2, 3)
b'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('hhl', b'\x00\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)
>>> calcsize('hhl')
8

위 코드에서 h는 short integer, l은 long integer로 1 2 3이 앞에서부터 각각의 포멧에 맞게 h, h, l에 대응되어 저장됩니다. short integer 1 = 2 byte로 \x00\x01, long integer 3 = 4 byte로 \x00\x00\x00\x03 이 됩니다.

calcsize 함수는 해당 구조체의 크기를 반환하는 함수로 h(2) + h(2) + l(4) = 8을 반환하고있습니다.

 

만약 C/C++의 float arr[5]라는 배열에 맞게 저장하려면 다음과 같이 할 수 있습니다.

pack('fffff', arr[0], arr[1], arr[2], arr[3], arr[4])
or
pack('5f', arr[0], arr[1], arr[2], arr[3], arr[4])

그러나 위와 같은 짧은 배열은 상관이 없지만 배열이 커지게 되면 일일이 다 써줄 수가 없습니다. 이런 경우에는 다음과 같이 써서 큰 변수들도 간단하게 저장할 수 있습니다.

pack(f'{len(arr)}f', *arr)