Python:struct
패킹 된 바이너리 데이터로 바이트열을 해석
바이트 순서, 크기 및 정렬
기본적으로 C 유형은 시스템의 기본 형식과 바이트 순서로 표시되며 필요한 경우 (C 컴파일러에서 사용하는 규칙에 따라) 패드 바이트를 건너뛰어 적절하게 정렬됩니다. 이 동작은 압축된 구조체의 바이트가 해당 C 구조체의 메모리 레이아웃과 정확히 일치하도록 선택됩니다. 기본 바이트 순서 및 패딩을 사용할지 또는 표준 형식을 사용할지는 애플리케이션에 따라 다릅니다.
또는, 다음 표에 따라, 포맷 문자열의 첫 번째 문자를 사용하여 패킹 된 데이터의 바이트 순서, 크기 및 정렬을 표시할 수 있습니다:
문자 | 바이트 순서 | 크기 | 정렬 |
| 네이티브 | 네이티브 | 네이티브 |
| 네이티브 | 표준 | none |
| 리틀 엔디안 | 표준 | none |
| 빅 엔디안 | 표준 | none |
| 네트워크 (= 빅 엔디안) | 표준 | none |
첫 번째 문자가 이들 중 하나가 아니면, '@'
로 가정합니다.
포맷 문자
포맷 문자는 다음과 같은 의미가 있습니다; C와 파이썬 값 사이의 변환은 형을 주면 분명해야 합니다. ‘표준 크기’ 열은 표준 크기를 사용할 때 패킹 된 값의 크기를 바이트 단위로 나타냅니다; 즉, 포맷 문자열이 '<', '>', '!' 또는 '=' 중 하나로 시작하는 경우입니다. 네이티브 크기를 사용할 때, 패킹 된 값의 크기는 플랫폼에 따라 다릅니다.
포맷 | C형 | 파이썬 형 | 표준 크기 | 노트 |
| 패드 바이트 | 값이 없습니다 | - | (7) |
| char | 길이가 1인 bytes | 1 | - |
| signed char | 정수 | 1 | (1), (2) |
| unsigned char | 정수 | 1 | (2) |
| _Bool | bool | 1 | (1) |
| short | 정수 | 2 | (2) |
| unsigned short | 정수 | 2 | (2) |
| int | 정수 | 4 | (2) |
| unsigned int | 정수 | 4 | (2) |
| long | 정수 | 4 | (2) |
| unsigned long | 정수 | 4 | (2) |
| long long | 정수 | 8 | (2) |
| unsigned long long | 정수 | 8 | (2) |
| ssize_t | 정수 | - | (3) |
| size_t | 정수 | - | (3) |
| (6) | float | 2 | (4) |
| float | float | 4 | (4) |
| double | float | 8 | (4) |
| char[] | bytes | - | (9) |
| char[] | bytes | - | (8) |
| void* | 정수 | - | (5) |
Integer를 Bytes로 직렬화
- 내장형 — Python 3.12.4 문서 # int.to_bytes
- struct — Interpret bytes as packed binary data — Python 3.12.4 문서 # examples
data = 9999
serialized_data = data.to_bytes(4, "big", signed=False)
print(serialized_data.hex()) ## 0000270f
result = int.from_bytes(serialized_data, "big", signed=False)
print(result) ## 9999
위 코드를 Python:struct 을 사용한 방식으로 변환하면:
from struct import calcsize, pack, unpack
data = 9999
serialized_data = pack('>I', data)
print(serialized_data.hex()) ## 0000270f
unpacked_data = unpack('>I', serialized_data)
assert isinstance(unpacked_data, tuple)
assert len(unpacked_data) == 1
result = unpacked_data[0]
print(result) ## 9999
print(calcsize('>I')) ## 4