本文主要是介绍Python3 数据编码方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 1 Python3 的数据编码
- 1.1 字符串
- 1.2 字节串
- 2 字符串与字节串的相互转化
- 2.1 字符串转化为字节串
- 2.2 字节串转化为字符串
- 3 十六进制字符串
- 3.1 十六进制字符串转化为字节串
- 3.2 字节串转化为十六进制字符串
- 4 参考资料
1 Python3 的数据编码
Python3 统一了编码方式,字符串就是 str,字节串就是 bytes。字符串 str 其实就是文本,统一使用 Unicode 编码。而字节串 bytes 就是原始的字节,本质是二进制数值。它们两者之间可以互相转化。
1.1 字符串
字符串举例:
>>> s = '字符串abc'
>>> s
'字符串abc'
>>> type(s)
<class 'str'>
如上例,字符串使用引号表示。Python3 统一使用 Unicode 编码,所以可以正常显示多种语言文字。
1.2 字节串
字节串举例:
>>> b = b'\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2abc'
>>> b
b'\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2abc'
>>> type(b)
<class 'bytes'>
如上例,一个字节串是以 b
开头,每个字节使用十六进制数值表示的串。因为字节串是存储于计算机中的最原始的数据,本质上二进制数值,但是为了提高阅读效率,一般使用十六进制表示。每个字节以 \x
开头,表示这是一个原始的二进制值。但是,在上例中,最后三个字节却没有以 \x
开头,显示的是字母 abc
。这就牵扯到 Python 的显示规则了,如果该十六进制值表示的是能够打印的 ASCII 码值,那么就直接打印出来,不使用十六进制表示。实际上,如果将末尾字母 abc
使用以 \x
开头的十六进制表示,其本质也是相等的。
>>> a = b'\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2abc'
>>> b = b'\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2\x61\x62\x63'
>>> a == b
True
如上例,将 abc 使用其对应的十六进制 0x61,0x62,0x63表示,也是与原始字节串相等的。
2 字符串与字节串的相互转化
字符串与字节串的转化可以使用 encode() 和 decode() 两个函数:
- 字符串转化为字节串:encode(),编码。
- 字节串转化为字符串:decode(),解码。
encode 和 decode 默认采用 utf-8 编码。
2.1 字符串转化为字节串
>>> '字符串abc'.encode()
b'\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2abc'
2.2 字节串转化为字符串
>>> b'\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2abc'.decode()
'字符串abc'
3 十六进制字符串
在实际编程中,经常遇到十六进制字符串。
>>> s = 'cc4a5ce1b3'
>>> type(s)
<class 'str'>
如上例,为了说明方便,本文把形如上例的字符串 s 称为十六进制字符串。当然,该字符串的长度肯定是偶数。s 本质上是一个字符串,但是在实际的编程实例中,其表示原始数据,为了用户友好,将原始的字节数值转化为用户可以看到的十六进制字符串。
3.1 十六进制字符串转化为字节串
在数据运算中,例如将该数据进行哈希运算,肯定要对其原始二进制数值进行哈希运算。那么就需要将该十六进制字符串转化为原始的字节串。
在 Python3 中,可以使用 bytes.fromhex()、binascii.a2b_hex()、binascii.unhexlify() 函数将十六进制字符串转化为其原始二进制数值,即以 \x
开头表示的每个字节。
>>> bytes.fromhex('cc4a5ce1b3')
b'\xccJ\\\xe1\xb3'
>>> binascii.a2b_hex('cc4a5ce1b3')
b'\xccJ\\\xe1\xb3'
>>> binascii.unhexlify('cc4a5ce1b3')
b'\xccJ\\\xe1\xb3'
如上例,以上三个函数都可将十六进制字符串转化为以 b 开头的字节串。但是,推荐使用 bytes.fromhex() 函数。这是因为该函数可以有效处理十六进制字符串中的空格,可以自动处理空格。
>>> bytes.fromhex('cc4a 5c e1b3')
b'\xccJ\\\xe1\xb3'
如上例所示,如果十六进制字符串中含有空格,则 bytes.fromhex() 函数可以正确处理。
3.2 字节串转化为十六进制字符串
可以使用 hex() 函数将原始数据字节串转化为可以阅读的十六进制字符串。该函数是 Python3.5 新加入的。
>>> b'\xccJ\\\xe1\xb3'.hex()
'cc4a5ce1b3'
>>> binascii.b2a_hex(b'\xccJ\\\xe1\xb3').decode()
'cc4a5ce1b3'
>>> binascii.hexlify(b'\xccJ\\\xe1\xb3').decode()
'cc4a5ce1b3'
如上例,可将以 b 开头的字节串转化为十六进制字符串。虽然有三种方式可以此目标,但是还是推荐使用 hex() 函数更简单快捷。
4 参考资料
- python3的decode()与encode()
这篇关于Python3 数据编码方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!