python中struct模块之字节型数据的处理方法

论坛 期权论坛 脚本     
niminba   2021-5-23 03:27   2438   0

简介

这个模块处理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]\CB OB ]Bg*9ayaiX]\9&y"yh."M 9o(9fa(:)yaL 9.*ke#9am.+yoey9i." :)yfa9.".."\fakf& B]\HHBH\H\NB]\CB]CB\B K\B \B B \B]\OB ]B."/].+\X(ygeeki!9y,y+%b!.)9aj:`yky.n#9&) 9.*c g&i&i&+/c.

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP