本文的示例代码参考struct-demo
目录
端序
字节顺序 又称端序或尾序 在计算机科学领域中 指存储器中或在数字通信链路中 组成多字节的字的字节的排列顺序
小端
小端(Little-Endian) 低字节放在内存低地址 高字节放在内存高地址
import struct
b = struct.pack('<H', 1)
print(b)
低字节 高字节
b'\x01\x00'
低地址 高地址
0x100 0x101
大端
大端(Big-Endian) 低字节放在内存高地址 高字节放在内存低地址
import struct
b = struct.pack('>H', 1)
print(b)
高字节 低字节
b'\x00\x01'
低地址 高地址
0x100 0x101
由来
Endian一词来源于十八世纪爱尔兰作家乔纳森·斯威夫特的小说《格列佛游记》 小说中 小人国为水煮蛋该从大的一端(Big-End)剥开还是小的一端(Little-End)剥开而争论 争论的双方分别被称为"大端派"和"小端派"
计算机电路先处理低位字节 效率比较高 因为计算都是从低位开始的 所以 计算机的内部处理都是小端字节序
人类还是习惯读写大端字节序 所以 除了计算机的内部处理 其他的场合几乎都是大端字节序 比如网络传输和文件储存
import struct
b = struct.pack('<H', 1)
print(b) # b'\x01\x00'
t = struct.unpack('>H', b)
print(t) # (256,)
struct
This module performs conversions between Python values and C structs represented as Python bytes objects. This can be used in handling binary data stored in files or from network connections.
示例
import struct
b = struct.pack('<IId3s', 12, 34, 118.89233398438, 'abc'.encode('utf-8'))
print(b)
t = struct.unpack('<2Id3s', b)
print(t)
t = struct.unpack('>2Id3s', b)
print(t)
b'\x0c\x00\x00\x00"\x00\x00\x00`\x01\x00\x00\x1c\xb9]@abc'
(12, 34, 118.89233398438, b'abc')
(201326592, 570425344, 2.8491594720547295e+154, b'abc')
端序
Character | Byte order |
---|---|
< | little-endian |
> | big-endian |
格式
Format | C Type | Python Type | Standard size |
---|---|---|---|
c | char | bytes of length 1 | 1 |
b | signed char | integer | 1 |
B | unsigned char | integer | 1 |
? | _Bool | bool | 1 |
h | short | integer | 2 |
H | unsigned short | integer | 2 |
i | int | integer | 4 |
I | unsigned int | integer | 4 |
l | long | integer | 4 |
L | unsigned long | integer | 4 |
q | long long | integer | 8 |
Q | unsigned long long | integer | 8 |
f | float | float | 4 |
d | double | float | 8 |
s | char[] | bytes | |
p | char[] | bytes | |
P | void * | integer |