Python中bytearray()函数概述
Python中bytearray()函数是一种可变序列类型,用于创建一个可变字节数组。与Python内置的byte()函数不同,bytearray()返回一个可变 bytearray 对象,可以随意修改每个元素的值。
在Python中,bytes对象是不可变的序列,因此无法在已经创建的字节数组上进行修改,这时候bytearray()就可以发挥作用了。使用bytearray()函数可以快速地创建一个可变字节数组,从而方便地进行修改操作。
创建bytearray对象
要创建一个bytearray对象,可以在括号中指定长度、初始化值或字符串,例如:
# 创建长度为4的bytearray对象
b1 = bytearray(4)
# 创建长度为5且初始化为0x00的bytearray对象
b2 = bytearray(b'\x00' * 5)
# 创建从字符串"hello"生成的bytearray对象
b3 = bytearray("hello", 'utf-8')
bytearray对象的方法
bytearray()函数返回的对象有许多方法,用于修改和访问字节数组的值。下面介绍一些常用的方法:
1. append(obj)
在bytearray的末尾添加一个元素。这个方法只接受长度为1的bytes或int类型。
b = bytearray(b'\x61\x62\x63')
b.append(0x64)
print(b)
# 输出:bytearray(b'abcd')
2. extend(iterable)
在bytearray的末尾添加一个可迭代对象中的所有元素。
b = bytearray(b'\x61\x62\x63')
b.extend(b'\x64\x65')
print(b)
# 输出:bytearray(b'abcde')
3. insert(index, obj)
在bytearray的指定位置插入一个元素。这个方法只接受长度为1的bytes或int类型。
b = bytearray(b'\x61\x62\x63')
b.insert(1, 0x64)
print(b)
# 输出:bytearray(b'adbc')
4. pop([index])
从bytearray中删除和返回指定索引对应的元素。如果没有指定索引,则删除并返回最后一个元素。
b = bytearray(b'\x61\x62\x63')
b.pop()
print(b)
# 输出:bytearray(b'ab')
5. remove(value)
删除bytearray中第一个匹配指定值的元素。
b = bytearray(b'\x61\x62\x63')
b.remove(0x62)
print(b)
# 输出:bytearray(b'ac')
6. reverse()
反转bytearray中的元素顺序。
b = bytearray(b'\x61\x62\x63')
b.reverse()
print(b)
# 输出:bytearray(b'cba')
使用bytearray()函数进行加密与解密
实现基于异或算法的加密和解密
异或算法是一种常用的加密算法,其基本思想是对明文中的每一个字节和密钥中的对应字节进行异或运算,得到密文中对应的字节。同样,对密文中的每一个字节和密钥中的对应字节进行异或运算,就能得到原文中对应的字节。
下面是使用bytearray()函数实现基于异或算法的加密和解密的示例代码:
def xor_encrypt(text, key):
btext = bytearray(text, 'utf-8')
bkey = bytearray(key, 'utf-8')
for i in range(len(btext)):
btext[i] ^= bkey[i % len(bkey)]
return btext
def xor_decrypt(text, key):
return xor_encrypt(text, key)
代码中使用了bytearray()函数将文本和密钥转换成字节数组,然后对每一个字节进行异或运算,最后返回加密或解密后的字节数组。
下面是加密和解密的示例代码:
text = "hello world"
key = "123"
encrypted = xor_encrypt(text, key)
print("加密后:", encrypted)
decrypted = xor_decrypt(encrypted, key)
print("解密后:", decrypted.decode('utf-8'))
运行示例代码可以得到以下输出:
加密后: bytearray(b'\x04\n\x05\x08\x18@J\x1f\x16B\r')
解密后: hello world
实现基于AES算法的加密和解密
AES算法是一种现代密码学中常用的对称加密算法。在Python中可以使用PyCryptodome模块进行AES算法的实现。下面是使用bytearray()函数进行AES加密和解密的示例代码:
from Crypto.Cipher import AES
# 长度必须为16的倍数
key = "1234567812345678".encode('utf-8')
iv = "1234567812345678".encode('utf-8')
def aes_encrypt(text, key, iv):
bs = AES.block_size
pad = lambda s: s + (bs - len(s) % bs) * chr(bs - len(s) % bs)
cipher = AES.new(key, AES.MODE_CBC, iv)
padded_text = pad(text).encode('utf-8')
encrypted = cipher.encrypt(bytearray(padded_text))
return encrypted
def aes_decrypt(text, key, iv):
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted = cipher.decrypt(bytearray(text))
unpad = lambda s: s[0:-ord(s[-1])]
return unpad(decrypted).decode('utf-8')
text = "hello world"
encrypted = aes_encrypt(text, key, iv)
print("加密后:", encrypted)
decrypted = aes_decrypt(encrypted, key, iv)
print("解密后:", decrypted)
代码中使用了bytearray()函数将加密和解密的文本转换成字节数组,然后使用PyCryptodome模块进行AES算法的加密和解密,最后返回加密或解密后的字节数组。
上述示例代码中的AES加密算法使用了CBC(Cipher-Block Chaining)模式,需要设置初始向量iv。运行示例代码可以得到以下输出:
加密后: bytearray(b'\xc1\xc4\xacG12\xb0\xfb\xbaz~\x8f\xdfq\x01\xdc')
解密后: hello world
结论
使用bytearray()函数能够快速地创建可变字节数组,并且方便地进行修改操作。在加密和解密等密码学场景下,bytearray()函数帮助我们实现数据的字节操作,使得代码更加简洁高效。在实际应用中,我们也可以结合其他模块如PyCryptodome来进一步扩展bytearray()函数的应用场景。