python中使用字节类型(bytes)来表示二进制信息,它是由单个字节构成的不可变序列。
字节类型的字面量的语法与字符串大致相同,只是添加了一个前缀`b`。
字节类型的字面量中只允许`ASCII`字符。
任何超过`127`的二进制值使用前缀`\x`和十六进制来表示。
## 编码与解码
字符串转换为对应的编码称为编码,根据字符编码转换为字符叫解码。
### 编码
字符串方法`.encode()`可以将字符串转换为对应的编码的`bytes`对象。
```python
>>> res = 'abc123'.encode('ascii')
>>> res
b'abc123'
>>> type(res)
bytes
```
因为都是ascii码字符,使用本身字面量来表示,所以看起来和字符串没有什么区别,除了多了一个前缀`b`。
```python
>>> res = '中'.encode('gbk')
>>> res
b'\xd6\xd0'
>>> len(res)
2
```
`中`字在`gbk`中的编码为`54992`,二进制表示为:
```python
>>> bin(54992)
'0b1101011011010000'
```
总共16位,需要两个字节来表示,按照16进制表示第一个字节为:
```python
>>> hex(0b11010110)
'0xd6'
```
第二个字节为:
```python
>>> hex(0b11010000)
'0xd0'
```
换成`\x`前缀后为:
```
'\xd6\xd0'
```
是不是跟上面的结果一样。
```python
>>> res = '中'.encode('utf-8')
b'\xe4\xb8\xad'
```
`utf-8`码,三个字节表示一个汉字。
### 解码
bytes对象方法`.decode()`可以将字节对象转换为对应编码的字符串对象。
```python
>>> b'\xd6\xd0'.decode('gbk')
'中'
```
注意:不是所有的二进制信息都可以解码为字符,只有以字符编码组织的二进制信息才可以解码为字符。当二进制信息不是以字符编码组织的,或者使用错误的字符编码进行解码会抛出异常。
```python
>>> b'\xd6\xd0'.decode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 0: invalid continuation byte
```
注意:为了解决字符串不一致的问题,python3中,所有的字符串在内存中都是以`unicode`来表示的,其它的编码再通过`uniocde`进行转换。
```python
>>> '中'.encode('unicode_escape')
b'\\u4e2d' # unicode
>>> b'\\u4e2d'.decode()
>>> b'\\u4e2d'.decode('unicode_escape')
'中'
```
- 第1章 编程基础
- 零基础能学Python吗?
- 编程语言是什么
- 编译型与解释型编程语言的区别
- python是什么?
- 学python能干什么?
- 第2章 python开发环境搭建
- windows下安装python
- cmd命令行工具
- 环境变量如何设置?
- 如何运行python程序?
- 学习神器Jupyter lab
- 第3章 基本数据类型
- 基本数据类型概述
- 变量的定义和使用
- 整数类型
- 浮点数类型
- 算术运算符
- 赋值运算符
- 字符串类型
- 字符串常用方法
- 字符串格式化
- 列表类型
- 元组类型
- 可变与不可变类型
- 深浅拷贝
- 集合类型
- 字典类型
- 布尔型
- NoneType
- 第4章 程序流程控制
- 程序结构
- if分支语句
- while条件循环
- for循环
- 循环控制关键字
- 异常处理
- 第5章函数与代码复用
- 函数的定义和调用
- 函数的参数
- 函数的返回值
- lambda函数
- 变量作用域
- python内建函数
- 第6章 面向对象
- 类和对象
- 属性
- 方法
- 继承
- super()函数
- 多态
- 私有化
- 自省与反射机制
- 第7章 模块和包
- 模块
- 包
- 第三方库
- 第8章 文件IO操作
- 文件概述
- 字符编码
- 字节类型
- python读取文件
- python写文件
- 文件指针