0. 前言

在了解到python的灵活性之后,一些之前采用C++去做的内容现在都耐不住想往python转。

手上有一个串口传感器需要读写数据,于是学习一下python中处理字节的有关接口。

本文主要参考官方文档:Binary Sequence Types


1. 数据类型

处理字节的数据类型主要有bytesbytearray,这二者都是python的内置类型,区别在于前者是不可变序列,后者可变(类似于tuplelist的关系)。

出于灵活性考虑使用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()函数没找到返回-1index()函数没找到将报错

❗️❗️❗️ 所有传入的参数不能是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的形式

如有错误欢迎指正,共同进步~


今天你学废了吗?

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐