python中怎么查看二进制转换的数据_python二进制数据

一直以来对python的二进制数据搞不清楚。

一、二进制显示格式与实际存储值区别

1.二进制数据在python中以字节(bytes)类型和字节数组类型(bytearray)保存着,前者数据固定,后者不固定,可继续添加。其每个元素为一个字节的数值,这就要求每个元素数值必须位于【0,255】之间,因为一个字节只能表示这个范围的数据。

2.由于字节或字节数组类型元素只能处于【0,255】之间,因此要表示中文(通常是三个字节(utf-8编码)),必须将中文转成字节格式,下例就出错了:

>>> b'中文'

File "", 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

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'

因此参数里不能是基数个字符

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值