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]
还可以通过int.frombyte()函数,将一个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的形式
如有错误欢迎指正,共同进步~
今天你学废了吗?
本文介绍了Python中处理字节的基本类型bytes和bytearray,以及如何进行类型转换,包括从字节到int,int到字节。还详细讲解了查看十六进制值、查找、拼接等常用接口,并提供了实例。强调所有操作必须以字节形式(b'abc')进行,而非str字符串。
2699





