前言:
最近在学习python网络编程这一块,在写简单的socket通信代码时,遇到了struct这个模块的使用,那么在这里就简单的介绍一下struct模块
了解c语言的人,一定会知道struct结构体在c语言中的作用,它定义了一种结构,里面包含不同类型的数据(int,char,bool等等),方便对某一结构对象进行处理。而在网络通信当中,大多传递的数据是以二进制流(binary data)存在的。当传递字符串时,不必担心太多的问题,而当传递诸如int、char之类的基本数据的时候,就需要有一种机制将某些特定的结构体类型打包成二进制流的字符串然后再网络传输,而接收端也应该可以通过某种机制进行解包还原出原始的结构体数据。 python中的struct模块就提供了这样的机制。
一、struct的作用是什么
该模块的主要作用就是对python基本类型值与 bytes字节流之间的转换
二、学习struct之前需要具备的知识
1.字节顺序/大小/对齐
默认情况下,pack是使用本地C库的字节顺序来编码的。格式化字符串的第一个字符可以用来表示填充数据的字节顺序、大小和对齐方式,如下表所描述的:
如果格式符中没有设置这些,那么默认将使用 @。
本地字节顺序是指字节顺序是由当前主机系统决定。比如:Intel x86和AMD64(x86-64)使用小字节序; Motorola 68000和 PowerPC G5使用大字节序。ARM和Intel安腾支持切换字节序。可以使用sys.byteorder查看当前系统的字节顺序。
本地大小(Size)和对齐(Alignment)是由c编译器的sizeof表达式确定的。它与本地字节顺序对应。
2.fmt格式化
struct其实使用起来很简单,但是有些人对struct中fmt格式化的含义了解不是很清楚,导致使用起来非常困难,这里需要了解一下c语言中的类型含义
字符 | C类型 | C含义 | python类型 | 标准尺寸 |
---|---|---|---|---|
x | 填充字节 | 转义字符 | 没有意义的值 | |
c | char | 容纳单字符的一种基本数据类型 | 长度为1的字节 | 1 |
b | signed char | 有符号 | 整型 | 1 |
B | unsigned char | 无符号 | 整型 | 1 |
? | _Bool< |