python⼆进制数据
⼀直以来对python的⼆进制数据搞不清楚。
⼀、⼆进制显⽰格式与实际存储值区别
1.⼆进制数据在python中以字节(bytes)类型和字节数组类型(bytearray)保存着,前者数据固定,后者不固定,可继续添加。其每个元素为⼀个字节的数值,这就要求每个元素数值必须位于【0,255】之间,因为⼀个字节只能表⽰这个范围的数据。
2.由于字节或字节数组类型元素只能处于【0,255】之间,因此要表⽰中⽂(通常是三个字节(utf-8编码)),必须将中⽂转成字节格式,下例就出错了:
>>> b'中⽂'
File "<stdin>", line 1
SyntaxError: bytes can only contain ASCII literal characters.
错误原因是字节只能包含ASCII常量字符
解决办法是先将中⽂字符转其他类型的编码即可,如转成utf-8编码:
>>> '中⽂'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
这就是unicode与bytes之间相互转化⽅式,我们循环这个bytes:
>>> for i in b'\xe4\xb8\xad\xe6\x96\x87':
... print(i)
...
228
python 定义数组184
173
230
150
135
发现字符“中”由三个8位数据构成,即228 184 173,我们将其转化成⼆进制格式:
>>> bin(228)
'0b11100100'
>>> bin(184)
'0b10111000'
>>> bin(173)
'0b10101101'
发现字符“中”的utf-8编码⽅式为:11100100 10111000 10101101,这也是它在计算机中存储的⽅式。
3.ASCII码能够表⽰的字符(0-9a-zA-Z及⼀些标点符号转义字符等)转化成utf-8码不发⽣改变,因为utf-8编码是ASCII编码的超集。>>> 'afAFA!@#'.encode('utf-8')
b'afAFA!@#'
⽽实际上存储的是各字符的ASCII码值:
>>> for i in b'afAFA!@#':
... print(i)
...
97
102
65
70
65
33
64
35
当中英⽂混合时我们看的更清楚:
>>> '中c'.encode()
b'\xe4\xb8\xadc'
我们看到最后的字符c并没有发⽣转义成⼗六进制,仍然是c。
这就是说明,tytes类型显⽰格式是⼗六进制格式,ASCII码原样不改变,但最终存储的值还是对应⼗六进制值格式对等的⼆进制格式值。始终记住:显⽰的是⼗六进制格式,存储的是对应的码值。如:
>>> b'a'[0]
97
显⽰的是字符a,实际上保存的是对应的ASCII码值97.
⼆、binascii模块:
binascii模块定义了很多⼆进制转化的函数。
binascii.hexlify() 将单个字符转化成对应码值的⼗六进制格式(\xxx)格式
>>> binascii.hexlify(b'\xefmm')
b'ef6d6d'
binascii.unhexlify() 两个字符为单位,看作⼗六进制值,转化成对应码值的字符格式
>>> binascii.unhexlify(b'ef6d6d')
b'\xefmm'
因此参数⾥不能是基数个字符
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论