二进制数据本文主要介绍二进制数据的编解码,涉及到的模块有base64、struct、chardet。base64base64模块主要提供将二进制数据编码为可打印的ASCII字符并将这些编码解码回二进制数据的功能。本文主要介绍模块中的两个函数b64encode()和b64decode()。b64encode()和b64decode()>>>importbase64#encoding>>>s=b'helloworld'>>>base64.b64encode(s)b'aGVsbG8gd29ybGQ='#decoding>>>s1=b'aGVsbG8gd29ybGQ='>>>base64.b64decode(s1)b'helloworld'b64encode()的作用是对bytes-like对象进行Base64编码,返回编码后的字节;b64decode()的作用是对类Base64对象或ASCII字符串编码后的字节进行解码,返回解码后的字节。关于base64模块的更多详细信息,请参考:https://docs.python.org/3.8/library/base64.htmlstruct模块可以进行Python值与Python字节对象表示的C结构之间的转换。这可用于处理存储在文件中或从其他来源(如网络)获取的二进制文件。接下来主要介绍pack()和unpack().pack()和unpack()这两个函数的使用方法>>>fromstructimportStruct>>>record_struct=Struct('>hhl')>>>record_struct包(1,2,3)b'\x00\x01\x00\x02\x00\x00\x00\x03'>>>record_struct.unpack(b'\x00\x01\x00\x02\x00\x00\x00\x03')(1,2,3)pack函数是将数据类型转换成bytes,unpack是将bytes转换成相应的数据类型。这里通过创建一个Struct的实例,指定一种格式>hhl,其中>表示big-endian大端模式,即高位字节排列在内存的低地址端,低位-顺序字节排列在内存的高地址端。h表示对应于C的short类型的2字节有符号整数;l代表一个4字节有符号整数,对应C的long类型。struct模块定义的数据类型可以参考Python官方文档:https://docs.python.org/3/library/struct.html#format-stringshttps://docs.python.org/3/library/struct。html#format-charactersspack()和unpack()操作可以作为模块级函数调用,例如:>>>fromstructimport*>>>pack('hhl',1,2,3)b'\x01\x00\x02\x00\x03\x00\x00\x00'>>>解压('hhl',b'\x01\x00\x02\x00\x03\x00\x00\x00')(1,2,3)这样的操作,当代码的相同结构出现在多个地方时,格式需要写多次。推荐创建一个Struct实例,指定格式代码后,所有操作集中处理。这也使得维护代码更加容易。chardetcardet是一个第三方库,是一个通用的字符编码检测器。顾名思义,就是用来检测编码的。安装chardet使用chardet需要安装(如果安装了Anaconda可以跳过),使用如下命令:$pipinstallchardet以chardet为例说明如何使用chardet进行编码检测。示例代码如下:>>>importchardet>>>chardet.detect(b'Helloworld!'){'encoding':'ascii','confidence':1.0,'language':''}检测到的编码是ascii,这里是一个参数confidence,其中1.0(即100%)代表检测到的概率。尝试检测GBK编码的中文:>>>data="黄河西来伐昆仑,怒吼千里触龙门".encode('gbk')>>>chardet.detect(data){'encoding':'GB2312','confidence':0.99,'language':'Chinese'}检测到的编码是GB2312。请注意,GBK是GB2312的超集。两者是相同的编码。检测概率为99%。语言字段所指示的语言为中文。您可以尝试检测日语:>>>data='いちだいさんぜんだいせんせかい'.encode('euc-jp')>>>chardet.detect(data){'encoding':'EUC-JP','confidence':0.99,'language':'Japanese'}使用chardet模块进行编码检测,可以有效获取编码进行转换,方便后续使用。以下链接列出了chardet支持的编码列表:https://chardet.readthedocs.io/en/latest/supported-encodings.html参考来源DavidM.Beazley;BrianK.Jones.PythonCookbook,第3版i.O'ReillyMedia。2013.卢西亚诺·拉马略。流利的Python。奥莱利媒体。2015年“base64—Base16、Base32、Base64、Base85数据编码”.docs.python.org。2020年1月26日检索“struct—Interpretbytesaspackedbinarydata”。docs.python.org。2020年1月26日检索“用法”。chardet.readthedocs.io。2020年1月28日检索“支持的编码”.chardet.readthedocs.io。2020年1月28日检索廖雪峰。《Python教程》.liaoxuefeng.com.[2020-01-28].以上是本文的主要内容。欢迎关注微信公众号《书所集录》
