精准地来讲, 不存在专门用以处理字节的数据类型。不过因为str既是字符串, 同时又能够表示字节, 所以, 字节数组等于str。而在C语言当中, 我们能够便利地运用union来处理字节, 以及字节与int、float之间的转换。
于其中, 举例来讲, 若要将一个32位无符号整数转变为字节, 此字节实则为长度是4的str,那么你就需要借助位运算符像这样去书写:
>>> n = 10240099 >>> b1 = chr((n & 0xff000000) >> 24) >>> b2 = chr((n & 0xff0000) >> 16) >>> b3 = chr((n & 0xff00) >> 8) >>> b4 = chr(n & 0xff) >>> s = b1 + b2 + b3 + b4 >>> s '\x00\x9c@c'非常麻烦。如果换成浮点数就无能为力了。
好在提供了一个模块来解决str和其他二进制数据类型的转换。
的pack函数把任意数据类型变成字符串:
>>> import struct >>> struct.pack('>I', 10240099) '\x00\x9c@c'pack的第一个参数是处理指令,'>I'的意思是:
代表字节顺序为big-, 此即网络序, I意味着为4字节无符号整数句号。
后面的参数个数要和处理指令一致。
把str变成相应的数据类型:
>>> struct.unpack('>IH', '\xf0\xf0\xf0\xf0\x80\x80') (4042322160, 32896)按照>IH的阐释, 后续的str会逐个变成, I: 呈4字节无符号整数形态, 以及H: 为2字节无符号整数样式。
故而, 哪怕不适用于去编写那种针对底层进行操作的字节流代码, 然而在那些针对性能要求并非很高的地方, 运用起来可就便利许多了。
模块定义的数据类型可以参考官方文档:
.bmp格式的位图文件, 是特别简单的一种文件格式, 我们针对它来做一番分析。
首先找一个bmp文件,没有的话用“画图”画一个。
读入前30个字节来分析:
>>> s = '\x42\x4d\x38\x8c\x0a\x00\x00\x00\x00\x00\x36\x00\x00\x00\x28\x00\x00\x00\x80\x02\x00\x00\x68\x01\x00\x00\x01\x00\x18\x00'BMP格式采用小端方式存储数据,文件头的结构按顺序如下:
有两个字节, 其中'BM'代表位图, 'BA'代表OS/2位图;存在一个4字节整数, 其表示位图大小;又有一个4字节整数, 它用于保留位还始终为0;再有一个4字节整数, 它表示实际图像的偏移量;还有一个4字节整数, 是关于其字节数的;另外有一个4字节整数, 用来表示图像宽度;也有一个4字节整数, 用来表示图像高度;有一个2字节整数且始终是1;最后有一个2字节整数, 代表颜色数。
所以,组合起来用读取:
>>> struct.unpack('<ccIIIIIIHH', s) ('B', 'M', 691256, 0, 54, 40, 640, 360, 1, 24)结果呈现出来, 'B''M'所表明的乃是位图, 位图具备这样的大小, 颜色数量是24。