python 에서는 binary packing 을 위해서 struct 라는 모듈을 제공한다.
문자 |
바이트 순서 |
크기와 정렬 |
@ |
시스템에 따름 |
|
= |
시스템에 따름 |
없음 |
< |
Little endian |
없음 |
> |
Big endian |
없음 |
! |
네트워크 (Big endian) |
없음 |
Format | C Type | Python type | Standard size | Notes |
---|---|---|---|---|
x | pad byte | no value | ||
c | char | string of length 1 | 1 | |
b | signed char | integer | 1 | (3) |
B | unsigned char | integer | 1 | (3) |
? | _Bool | bool | 1 | (1) |
h | short | integer | 2 | (3) |
H | unsigned short | integer | 2 | (3) |
i | int | integer | 4 | (3) |
I | unsigned int | integer | 4 | (3) |
l | long | integer | 4 | (3) |
L | unsigned long | integer | 4 | (3) |
q | long long | integer | 8 | (2), (3) |
Q | unsigned long long | integer | 8 | (2), (3) |
f | float | float | 4 | (4) |
d | double | float | 8 | (4) |
s | char[] | string | ||
p | char[] | string | ||
P | void * | integer | (5), (3) |
pack(format, values ...)
>>> struct.pack('HHL',1,2,3)
'\x01\x00\x02\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00'
>>> struct.pack('!HHL',1,2,3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> struct.pack('< HHL',1,2,3)
'\x01\x00\x02\x00\x03\x00\x00\x00'
>>> struct.pack('> HHL',1,2,3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
unsigned long의 경우 64bit system에서는 8 bytes를 차지하지만, network order에서는 4bytes를 차지함
>>> struct.calcsize('L')
8
>>> struct.calcsize('!L')
4
unpack(format, value)
return 값은 tuple로 리턴됨
>>> value = struct.pack('HH', 1,2)
>>> struct.unpack('HH',value)
(1, 2)