python的二进制转化模块如何理解

python的二进制转化模块如何理解

这篇文章将为大家详细讲解有关python的二进制转化模块如何理解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

在pyton中,通过struct模块来对二进制进行转换,主要包括两大类函数,即用于打包的pack和用于解包的unpack。

python的二进制转化模块如何理解

其中,struct.pack的输入格式为struct.pack(format, v1, v2, ...),其中format为格式字符串,v1,v2..为将要转成bytes的字符。

例如

>>>importstruct>>>struct.pack('i',15)b'\x0f\x00\x00\x00'>>>struct.pack('iii',15,16,17)b'\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00'>>>struct.pack('b',255)#b格式的取值范围是-128到127struct.error:byteformatrequires-128<=number<=127>>>struct.pack('B',200)b'\xc8'>>>struct.pack('B',71)#128以内可用ASCII表示b'G'

i代表int,15对应的二进制代码为F000,故其输出为b\x0f\x00\x00\x00。当格式字符串为iii时,说明要将三个数字以整数类型转化为二进制。

其中,格式化字符串中的每个字符都代表一种数据类型,其中整型相关的字符如下,左侧为带符号整型,右侧为无符号整型

C语言类型C语言类型标准大小
bsigned charBunsigned char1
hshortHunsigned short2
iintIunsigned int4
llongLunsigned long4
qlong longQunsigned long long8
nssize_tNsize_t

其他类型

格式C 类型Python 类型标准大小
x填充字节
cchar长度为1的字节串
?_Boolbool1
efloat2
ffloatfloat4
ddoublefloat8
schar[]字节串
pchar[]字节串
Pvoid*整数

struct中提供了获取标准大小的函数,calcsize:

>>>struct.calcsize('B')1>>>struct.calcsize('i')4

除了声明被格式化时的数据类型,struct还可以指定对齐方式,例如

>>>struct.pack("i",15)b'\x0f\x00\x00\x00'>>>struct.pack(">i",15)#小端序b'\x00\x00\x00\x0f'>>>struct.pack("<i",15)#大端序b'\x0f\x00\x00\x00'

其对应字符的含义分别为

@=<>!
本机本机小端大端网络(大端)

其中默认为@,即本机字节顺序。

在熟悉了pack之后,与之对偶的unpack也就没啥难度了

>>>test=struct.pack("III",125,1255,12555)>>>struct.unpack("III",test)(125,1255,12555)

除了packunpackstruct模块还提供了C语言风格的一对函数pack_intounpack_from,二者的声明分别为

struct.pack_into(format,buffer,offset,v1,v2,...)struct.unpack_from(format,/,buffer,offset=0)

其中buffer表示缓冲流,在pack_into中,将v1,v2...offset的偏置打包入buffer中;在unpack_from中,将buffer中的数据从offset处依次取出。

struct中封装了用于二进制处理的类Struct,按照以往经验,其pack函数的实现方法很有可能是下面这种

defpack(format,*args):returnStruct(format).pack(args)

其中Struct的初始化方法就是输入一个格式化字符串,例如

>>>s=struct.Struct("III")>>>s.pack(1,2,3)b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00'

关于python的二进制转化模块如何理解就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

发布于 2022-01-05 23:23:53
收藏
分享
海报
0 条评论
33
上一篇:Java Spring AOP源码解析中的事务实现原理是什么 下一篇:Unity基于ShaderLab实现光照系统的代码怎么写
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码