文章目录
- 0. 前言
- 1. 数据类型
- 2. 类型转换
- 3. 常用接口
0. 前言
在了解到python
的灵活性之后,一些之前采用C++
去做的内容现在都耐不住想往python
转。
手上有一个串口传感器需要读写数据,于是学习一下python
中处理字节的有关接口。
本文主要参考官方文档:Binary Sequence Types
1. 数据类型
处理字节的数据类型主要有bytes
和bytearray
,这二者都是python
的内置类型,区别在于前者是不可变序列,后者可变(类似于tuple
与list
的关系)。
出于灵活性考虑使用bytearray
会更多一些,本文的例子也主要以bytearray
为主。
要创建一个bytearray
,可以通过构造函数,也可以通过字面量b'abc'
创建,字面量默认为bytes
类型:
b = bytes(10) # 创建大小为10,全部填0
b = bytes(range(10)) # 1-10
b = b'123'
ba = bytearray(b'123')
print(b) # b'abc'
print(ba) # bytearray(b'abcd')
2. 类型转换
常用当属转成int
了,可以直接取[]
索引取出单个字节得到int
值:
a = b'abc'[0] # 97
也可以将bytearray
转换成list
得到一个int
型数组:
arr = list(b'abc') # [97, 98, 99]
还可以通过()
函数,将一个bytes
整体转成int
:
m = b'\xa0\x86\x01\x00'
a = int.from_bytes(m, byteorder='little', signed=True)
print(a) # 10000
从int
转回bytes
用到int.to_bytes()
函数,指定字节数、字节序(大小端)、是否有符号:
a = 100000
m = a.to_bytes(4, byteorder='little', signed=True)
print(m) # b'\xa0\x86\x01\x00'
需要注意:字节数必须能够表示该整数,如
a=10000
时,指定字节数为1
将产生错误。
3. 常用接口
首先,当然是查看十六进制数据具体值,可以使用hex()
函数,将返回一个字符串,每个字节由2个十六进制位组成:
b'\xf0\xf1\xf2'.hex() # 'f0f1f2'
# 也可以从16进制字符串转成bytes,将忽略所有空白部分
bytes.fromhex('2Ef0 F1f2 ') # b'.\xf0\xf1\xf2'
查找函数主要有find()、rfind()
和index()、rindex()
,r
开头表示从后往前查找。find()
函数没找到返回-1
,index()
函数没找到将报错。
❗️❗️❗️ 所有传入的参数不能是str字符串(如
'abc'
),依旧需要用b'abc'
的形式;
拼接、截取可通过+
和切片实现:
a = b'123456'
b = a[1:] # b == b'23456'
c = b'abc' + a # c == b'abc123456'
还有很多方便的接口,不具体展开,需要使用的时候再去这里看文档即可:
- 替换:
replace()
- 判断前缀后缀:
startswith()、endswith()
- 分割:
split()
- 从头尾移除特定字符:
strip
,默认移除空白,如传入b'abc'
可以删除前后所有abc
的任意组合; - 是否只有数字:
isalnum()
,可以为空 - 是否是数字:
isdigit()
,不能为空 - 是否只有字母:
isalpha()
- 是否只有
ascii
字符:isascii()
,每个字节取值都在[0, 0x7F]
- 大小写判断:
islower()、isupper()
,不能为空 - 大小写化:
lower()、upper()
- 标题判断和标题化:
istitle()、title()
,判断或转成Hello World
的形式
如有错误欢迎指正,共同进步~
今天你学废了吗?