Python3之字节串bytes与字节数组bytearray的使用详解
在Python3中,字节串(bytes)和字节数组(bytearray)是存储字节序列的两种方式。在本文中,我们将会详细讲解字节串和字节数组的使用,以及它们在Python编程中的用处。
字节串(bytes)
字节串(bytes)是一种用来存储字节序列(byte sequence)的不可变的数据类型。在Python3中,字节串可以通过以下方式创建:
b = b'hello world'
上述代码创建了一个字节串变量b,该变量存储"hello world"字符串的字节序列。请注意,字节串必须使用b前缀来加以区分。
接下来,让我们看看如何访问字节串的单个字节。可以通过类似列表(list)的方式来访问字节串中的元素,如下所示:
print(b[0]) # 104
print(b[1]) # 101
print(b[2]) # 108
上述代码将会依次输出字节串中第一个、第二个、第三个字节的ASCII码值,也就是'h'、'e'、'l'。
在Python3中,字节串也支持切片(slicing)操作。例如,我们可以使用以下代码来获取'h'和'e'所对应的字节:
print(b[:2]) # b'he'
另外,如果我们需要将一个字符串转换为字节串,可以使用以下代码:
s = "hello world"
b = s.encode()
上述代码将会创建一个新的字节串变量b,该变量包含了字符串s的字节表示。默认情况下,Python3使用UTF-8编码来将字符串转换为字节串。
字节数组(bytearray)
字节数组(bytearray)是一种用来存储字节序列的可变的数据类型。它与字节串类似,但是允许我们修改其中的元素。在Python3中,字节数组可以通过以下方式创建:
barr = bytearray(b'hello world')
上述代码创建了一个字节数组变量barr,该变量存储了"hello world"字符串的字节序列。请注意,我们在创建字节数组时需要先将字节串转换为字节数组。
接下来,让我们看看如何修改字节数组中的元素。与列表类似,我们可以使用索引和赋值操作来修改字节数组中的元素。例如,以下代码将会把字节数组中的第一个字节设为'A':
barr[0] = ord('A')
请注意,上述代码中,我们使用了ord函数来获取字母'A'的ASCII码值。
在Python3中,字节数组也支持切片操作。为了演示该操作,我们可以使用以下代码来将字节数组中的前两个字节替换为'b1'和'b2':
barr[:2] = b'b1b2'
示例说明
示例一:计算SHA256哈希值
让我们用一个示例来说明字节串和字节数组的用处。假设我们需要计算一个字符串的SHA256哈希值。我们可以使用Python3内置的hashlib库来完成此任务。然而,该库仅支持字节串作为输入。因此,我们需要将字符串转换为字节串,如下所示:
import hashlib
s = "hello world"
b = s.encode()
m = hashlib.sha256()
m.update(b)
print(m.hexdigest())
上述代码将会输出字符串"hello world"的SHA256哈希值。
示例二:修改JPEG图像的宽度和高度
字节数组也可以用于图像处理。假设我们需要将一张JPEG图像的宽度和高度各缩小一半。我们可以使用Python3内置的Pillow库来读取和修改JPEG图像。以下是修改一张名为"cat.jpg"的JPEG图像的宽度和高度的示例代码:
from PIL import Image
with open('cat.jpg', 'rb') as f:
barr = bytearray(f.read())
im = Image.open(f)
width, height = im.size
new_width, new_height = width // 2, height // 2
# 修改JPEG文件头
barr[3] = 0xC0 # SOF0的标识符
barr[5:7] = new_height.to_bytes(2, byteorder='big')
barr[7:9] = new_width.to_bytes(2, byteorder='big')
with open('cat_small.jpg', 'wb') as f:
f.write(barr)
上述代码将会读取名为"cat.jpg"的JPEG图像,并把它的宽度和高度各缩小一半。最后,代码将会把修改后的图像存储为"cat_small.jpg"。
总结
在Python3的编程中,字节串和字节数组的使用是非常普遍的。字节串可以用于数据的编码和解码,而字节数组则可以用于数据的处理和修改。在本文中,我们详细讲解了字节串和字节数组的使用,并且提供了示例代码来帮助读者更好地理解。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python3之字节串bytes与字节数组bytearray的使用详解 - Python技术站