简介
这个模块处理python中常见类型数据和Python bytes之间转换。这可用于处理存储在文件或网络连接中的bytes数据以及其他来源。在python中没有专门处理字节的数据类型,建立字节型数据也比较麻烦,我们知道的bytes()函数也只能对无符号整型做处理,并且数据如下(没错,数字为多少就有多少个\x00,我们要是用这种方式来存储大量数据,结果可想而知):
va = bytes(1) # va: '\x00'
vb = bytes(2) # vb: '\x00\x00'
vc = bytes(5) # vc: '\x00\x00\x00\x00\x00'
但在python中str类型中既可以用字符串表示也可以以字节方式表示,所以你定义一个字节型的字符串常量,python是能处理它的:
va = '\x26' # va: '&'
struct处理
字节顺序
一个数据有多个字节表示的时候,字节的顺序不同也就决定了值,在struct中有以下几种字节顺序:
字符 |
字节顺序 |
尺寸 |
对齐方式 |
@ |
本机 |
本机 |
本机 |
= |
本机 |
标准 |
无 |
< |
小端 |
标准 |
无 |
> |
大端 |
标准 |
无 |
! |
网络 |
标准 |
无 |
对于字节顺序,只有大端和小端两种方式,只是比如你用@和=代表你用本机的字节顺序,!代表你使用网络的字节顺序。你不指定字节顺序则默认的是@。
本地字节顺序是大端或小端,取决于主机系统。例如,Intel x86和AMD64(x86-64)是小端的; 摩托罗拉68000和PowerPC G5是大端; ARM和Intel Itanium具有可切换的字节序(双字节序)。使用sys.byteorder来检查你的系统的字节顺序。
数据格式
struct支持的打包解包的数据格式如下,我们需要指定格式才能对应处理,其中对应尺寸已列出(以字节为单位):
字符 |
C类型 |
python类型 |
标准尺寸 |
x |
填充字节 |
没有意义的值 |
|
c |
char |
长度为1的字节 |
1 |
b |
signed char |
整型 |
1 |
B |
unsigned char |
整型 |
1 |
? |
_Bool |
布尔 |
1 |
h |
short |
整型 |
2 |
H |
unsigned short |
整型 |
2 |
i |
int |
整型 |
4 |
I |
unsigned int |
整型 |
4 |
l |
long |
整型 |
4 |
L |
unsigned long |
整型 |
4 |
q |
long long |
整型 |
8 |
Q |
unsigned long long |
整型 |
8 |
n |
ssize_t |
整型 |
|
N |
size_t |
整型 |
|
e |
|
浮动 |
2 |
f |
float |
浮动 |
4 |
d |
double |
浮动 |
8 |
s |
char[] |
字节 |
|
p |
char[] |
字节 |
|
P |
void * |
整型 |
|
打包
通过struct的pack(fmt, *args)来实现对各种数据的打包(转换为对应字节数据),pack的需要传递的参数fmt就是数据的格式,包括了字节顺序、数据类型;后面的*args参数是需要打包的数据。
vaa = struct.pack('>I', 1255) # vaa: '\x00\x00\x04\xe7' 1*4=1个字节 vab = struct.pack('>II', 1255, 23) # vab: '\x00\x00\x04\xe7\x00\x00\x00\em9g\[K\Y\ZYHX[X RIY\[^
CBBa/cy`c[^
X^J RIB[[\[JNB[YHX[X
Y\[^
CB[^
X^J
B/.y..c9faB[YH\^J[Y\O[Z[
CB[YH\\J[Y\ZY\YJCB/fa[\ \ [YB"y.#]J
CB[XY\[
[YB]\[XYBB]P]\]J
CBXY]\CBOB]Bg*9ayaiX]\9&y"yh."M9o(9fa(:)yaL
9.*ke#9am.+yoey9i." :)yfa9.".."\fakf&B]\HHBH\H\NB]\CB]CB\BK\B\BB
\B]\OB]B."/].+\X(ygeeki!9y,y+%b!.)9aj:`yky.n#9&) 9.*c g&i&i&+/c. |