首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Python-VBA函数之旅-bytearray函数

  • 25-03-03 04:24
  • 2295
  • 13222
blog.csdn.net

目录

1、bytearray函数:

1-1、Python:

1-2、VBA:

2、相关文章:

个人主页:非风V非雨-CSDN博客


        bytearray函数在Python中提供了一种可变字节序列的表示方式,这在实际编程中有多种应用场景。常见的应用场景有:

1、二进制数据处理:当需要处理二进制数据时,bytearray()是一个很好的选择。你可以使用它来存储和操作二进制数据,例如,读取或写入文件、网络通信中的数据包等。

2、内存中的缓冲区:bytearray()可以用作内存中的缓冲区,存储临时数据,并在需要时进行修改或传输。这在处理大量数据或需要频繁修改数据的场景中非常有用。

3、网络编程:在网络编程中,经常需要处理字节流。使用bytearray()可以方便地构建、修改和发送字节数据。

4、图像和视频处理:图像和视频数据通常以字节流的形式存储和传输。使用bytearray()可以方便地读取、修改和保存这些数据的特定部分,例如,修改图像的像素值或视频的编码参数。

5、序列化与反序列化:bytearray()可以用来存储序列化后的数据,如将对象转换为字节流进行存储或传输。反序列化时,可以从bytearray()中读取数据并还原为原始对象。

6、加密与解密:在加密和解密算法中,bytearray()可以用来存储和处理加密数据。你可以使用bytearray()来执行加密操作,并将加密后的数据存储在bytearray()中,或者从bytearray()中读取加密数据进行解密。

7、自定义协议:当实现自定义的通信协议时,bytearray()可以用来构建和解析协议中的字节数据。你可以使用bytearray()来定义协议的数据结构,并根据协议规范进行数据的编码和解码。

        这些只是bytearray()的一些常见应用场景,实际上,在处理与字节序列相关的任何任务时,bytearray()都可以作为一个灵活且强大的工具来使用。它的可变性使得它能够在需要时轻松地进行修改和调整,而不需要创建新的字节序列对象。

1、bytearray函数:
1-1、Python:
  1. # 1.函数:bytearray
  2. # 2.功能:用于处理可变字节序列,即创建可修改的字节数组
  3. # 3.语法:bytearray(source, encoding, errors)
  4. # 4.参数:
  5. # 4-1、source>>>
  6. # 1、整数,包括正整数、0和负整数
  7. # 2、字符串
  8. # 3、可迭代对象,包括但不限于以下类型:
  9. # 3-1、序列类型:
  10. # list(列表):有序的元素集合
  11. # tuple(元组):不可变的有序的元素集合
  12. # str(字符串):字符的有序集合
  13. # bytes(字节序列):字节的有序集合
  14. # bytearray(可变字节序列):可变的字节的有序集合
  15. # range(范围对象):表示一个不可变的整数序列
  16. # memoryview(内存视图):用于在不需要复制数据的情况下访问对象的内存
  17. # 3-2、集合类型:
  18. # set(集合):无序且不包含重复元素的集合
  19. # frozenset(冻结集合):不可变的无序且不包含重复元素的集合
  20. # 3-3、字典与字典视图:
  21. # dict(字典):无序的键值对集合
  22. # dict的keys()、values()、items()方法返回的视图对象
  23. # 3-4、文件对象:
  24. # 打开的文件对象也是可迭代的,可以通过迭代逐行读取文件内容
  25. # 3-5、自定义可迭代对象:
  26. # 任何定义了__iter__()方法的对象都可以被视为可迭代对象。这个方法应该返回一个迭代器对象
  27. # 3-6、生成器:
  28. # 生成器函数和生成器表达式创建的生成器对象也是可迭代的
  29. # 3-7、其他内置类型:
  30. # 某些内置的数据类型或函数返回的对象也可能是可迭代的,比如map、filter、zip等函数返回的对象
  31. # 4-2、encoding>>>表示进行转换时采用的字符编码,默认为UTF-8编码
  32. # 4-3、errors>>>表示错误处理方式(报错级别),常见的报错级别有:
  33. # 1、strict:严格级别(默认级别),字符编码有报错时即抛出异常
  34. # 2、ignore:忽略级别,字符编码有报错,忽略掉
  35. # 3、replace:替换级别,字符编码有报错,替换成符号“?”
  36. # 5.返回值:返回一个新的可变字节数组(若3个参数均未提供,则返回长度为0的字节数组)
  37. # 6.说明:
  38. # 6-1、如果参数source为字符串,那么参数encoding也必须提供,否则将提示TypeError错误。详情如下:
  39. # TypeError: string argument without an encoding
  40. # print(bytearray("myelsa"))
  41. # 6-2、如果参数source为可迭代对象,那么可迭代对象的元素必须为0-255的范围内的整数,否则将抛出异常。详情如下:
  42. # ValueError: byte must be in range(0, 256)
  43. # print(bytearray([1024, 8, 6]))
  44. # TypeError: 'float' object cannot be interpreted as an integer
  45. # print(bytearray([3.14, 1.5, 6.0]))
  46. # 6-3、bytearray()函数与bytes()函数的主要区别:前者产生的对象元素可以修改,而后者不能修改
  47. # 7.示例:
  48. # 应用1:二进制数据处理(增、删、改、查等操作)
  49. # 初始化bytearray
  50. data = bytearray([0x01, 0x02, 0x03, 0x04, 0x05])
  51. # 打印原始数据
  52. print("原始数据:", data)
  53. # 增加数据
  54. data.append(0x06)
  55. print("增加数据后的数据:", data)
  56. # 删除数据
  57. del data[2]
  58. print("删除数据后的数据:", data)
  59. # 修改数据
  60. data[3] = 0x07
  61. print("修改数据后的数据:", data)
  62. # 查找数据
  63. index = data.find(0x04)
  64. if index != -1:
  65. print("找到数据0x04的索引为:", index)
  66. else:
  67. print("未找到数据0x04")
  68. # 增加数据后的数据: bytearray(b'\x01\x02\x03\x04\x05\x06')
  69. # 删除数据后的数据: bytearray(b'\x01\x02\x04\x05\x06')
  70. # 修改数据后的数据: bytearray(b'\x01\x02\x04\x07\x06')
  71. # 找到数据0x04的索引为: 2
  72. # 应用2:内存中的缓冲区(包括初始化、写入数据、读取数据、修改数据、追加数据、切片操作以及清空缓冲区)
  73. # 创建一个bytearray作为内存缓冲区
  74. buffer = bytearray(10) # 初始化一个大小为10的内存缓冲区
  75. # 向内存缓冲区中写入数据
  76. buffer[0] = 1 # 写入一个字节
  77. buffer[1] = 2
  78. buffer[2:5] = [3, 4, 5] # 写入多个字节
  79. # 打印缓冲区的内容
  80. print("缓冲区内容:", buffer)
  81. # 读取缓冲区中的数据
  82. first_byte = buffer[0]
  83. print("第一个字节:", first_byte)
  84. # 修改缓冲区中的数据
  85. buffer[3] = 6
  86. print("修改后的缓冲区内容:", buffer)
  87. # 在缓冲区中追加数据
  88. buffer.extend([7, 8, 9])
  89. print("追加数据后的缓冲区内容:", buffer)
  90. # 缓冲区切片操作
  91. sub_buffer = buffer[2:7] # 获取一个子缓冲区
  92. print("子缓冲区内容:", sub_buffer)
  93. # 缓冲区大小
  94. print("缓冲区大小:", len(buffer))
  95. # 清空缓冲区
  96. del buffer[:]
  97. print("清空后的缓冲区内容:", buffer)
  98. # 缓冲区内容: bytearray(b'\x01\x02\x03\x04\x05\x00\x00\x00\x00\x00')
  99. # 第一个字节: 1
  100. # 修改后的缓冲区内容: bytearray(b'\x01\x02\x03\x06\x05\x00\x00\x00\x00\x00')
  101. # 追加数据后的缓冲区内容: bytearray(b'\x01\x02\x03\x06\x05\x00\x00\x00\x00\x00\x07\x08\t')
  102. # 子缓冲区内容: bytearray(b'\x03\x06\x05\x00\x00')
  103. # 缓冲区大小: 13
  104. # 清空后的缓冲区内容: bytearray(b'')
  105. # 应用3:网络编程
  106. import socket
  107. # 创建TCP客户端
  108. def create_tcp_client(server_address, port):
  109. client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  110. client_socket.connect((server_address, port))
  111. return client_socket
  112. # 构建二进制消息
  113. def build_message(data):
  114. # 假设我们有一个简单的协议,其中每个消息都以一个长度字节开始
  115. length = len(data).to_bytes(1, byteorder='big')
  116. message = bytearray(length) + bytearray(data, 'utf-8')
  117. return message
  118. # 解析二进制消息
  119. def parse_message(message):
  120. # 假设消息的第一个字节是长度
  121. length = message[0]
  122. data = message[1:length + 1].decode('utf-8')
  123. return data
  124. # 发送消息并接收响应
  125. def send_receive_message(client_socket, message):
  126. client_socket.sendall(message)
  127. response = client_socket.recv(4096) # 假设响应不会超过4096字节
  128. return response
  129. # 主函数
  130. if __name__ == "__main__":
  131. SERVER_ADDRESS = 'localhost'
  132. PORT = 12345
  133. MESSAGE = "Hello, Python!"
  134. # 创建TCP客户端
  135. client_socket = create_tcp_client(SERVER_ADDRESS, PORT)
  136. # 构建二进制消息
  137. binary_message = build_message(MESSAGE)
  138. # 发送消息并接收响应
  139. response = send_receive_message(client_socket, binary_message)
  140. # 解析响应
  141. response_data = parse_message(response)
  142. # 打印响应
  143. print("Received response:", response_data)
  144. # 关闭连接
  145. client_socket.close()
  146. # 应用4:图像和视频处理(注意:运行此程序,需要确保已经安装了pillow库)
  147. from PIL import Image
  148. import io
  149. # 读取图像文件到bytearray
  150. def read_image_to_bytearray(image_path):
  151. with open(image_path, 'rb') as file:
  152. byte_data = bytearray(file.read())
  153. return byte_data
  154. # 将bytearray写回到图像文件
  155. def write_bytearray_to_image(byte_data, output_path):
  156. with open(output_path, 'wb') as file:
  157. file.write(byte_data)
  158. # 读取图像并显示
  159. def display_image(image_path):
  160. image = Image.open(image_path)
  161. image.show()
  162. # 主函数
  163. if __name__ == "__main__":
  164. # 使用原始字符串或双反斜杠来处理Windows文件路径
  165. input_image_path = r'E:\python_workspace\pythonProject\input.jpg'
  166. output_image_path = r'E:\python_workspace\pythonProject\output.jpg'
  167. try:
  168. # 读取图像到bytearray
  169. image_bytearray = read_image_to_bytearray(input_image_path)
  170. # 显示原始图像
  171. display_image(input_image_path)
  172. # 将bytearray写回到新的图像文件
  173. write_bytearray_to_image(image_bytearray, output_image_path)
  174. # 显示从bytearray写回的图像,以验证内容是否正确
  175. display_image(output_image_path)
  176. except Exception as e:
  177. print(f"An error occurred: {e}")
  178. # 应用5:序列化与反序列化
  179. import struct
  180. def serialize_integers(integers):
  181. # 创建一个空的bytearray
  182. byte_data = bytearray()
  183. # 将每个整数转换为4字节的二进制数据并添加到bytearray中
  184. for integer in integers:
  185. # 使用struct来将整数打包为4字节的二进制数据
  186. packed_integer = struct.pack('i', integer)
  187. byte_data.extend(packed_integer)
  188. return byte_data
  189. def deserialize_integers(byte_data):
  190. integers = []
  191. # 以4字节为单位从bytearray中读取数据,并解包为整数
  192. while byte_data:
  193. # 使用struct来将4字节的二进制数据解包为整数
  194. unpacked_integer = struct.unpack('i', byte_data[:4])[0]
  195. integers.append(unpacked_integer)
  196. # 移除已处理的4字节数据
  197. byte_data = byte_data[4:]
  198. return integers
  199. # 主函数
  200. if __name__ == '__main__':
  201. # 用于序列化与反序列化整数列表
  202. original_integers = [3, 5, 6, 8, 10, 11, 24]
  203. # 序列化整数列表为bytearray
  204. serialized_data = serialize_integers(original_integers)
  205. print("Serialized bytearray:", serialized_data)
  206. # 反序列化bytearray为整数列表
  207. deserialized_integers = deserialize_integers(serialized_data)
  208. print("Deserialized integers:", deserialized_integers)
  209. # 验证反序列化后的数据是否与原始数据相同
  210. assert original_integers == deserialized_integers
  211. print("Serialization and deserialization successful!")
  212. # Serialized bytearray: bytearray(b'\x03\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x08\x00\x00\x00\n\x00\x00\x00\x0b\x00\x00\x00\x18\x00\x00\x00')
  213. # Deserialized integers: [3, 5, 6, 8, 10, 11, 24]
  214. # Serialization and deserialization successful!
  215. # 应用6:加密与解密(注意:运行此程序,需确保已经安装了加密算法库pycryptodome)
  216. from Crypto.Cipher import AES
  217. from Crypto.Util.Padding import pad, unpad
  218. from Crypto.Random import get_random_bytes
  219. def encrypt_data(key, plaintext):
  220. # AES加密要求密钥长度为16(AES128)、24(AES192)或32(AES256)字节
  221. # 如果密钥长度不足,可以通过某种方式(如哈希函数)扩展它
  222. # 这里我们假设key已经是合适的长度
  223. cipher = AES.new(key, AES.MODE_CBC)
  224. # 对明文进行填充,使其长度为16的倍数
  225. padded_plaintext = pad(plaintext, AES.block_size)
  226. # 加密填充后的明文
  227. ciphertext = cipher.encrypt(padded_plaintext)
  228. # 获取初始化向量(IV),它用于CBC模式
  229. iv = cipher.iv
  230. # 返回IV和密文,通常将它们拼接在一起
  231. return iv + ciphertext
  232. def decrypt_data(key, encrypted_data):
  233. # 分离IV和密文
  234. iv = encrypted_data[:AES.block_size]
  235. ciphertext = encrypted_data[AES.block_size:]
  236. # 使用相同的IV和密钥创建解密器
  237. cipher = AES.new(key, AES.MODE_CBC, iv=iv)
  238. # 解密密文
  239. decrypted_padded_text = cipher.decrypt(ciphertext)
  240. # 去除填充
  241. decrypted_text = unpad(decrypted_padded_text, AES.block_size)
  242. return decrypted_text
  243. # 主函数
  244. if __name__ == '__main__':
  245. key = get_random_bytes(16) # 生成一个随机的16字节AES密钥
  246. plaintext = b"I love python very much" # 明文消息,必须是bytes类型
  247. # 加密
  248. encrypted_data = encrypt_data(key, plaintext)
  249. print("Encrypted data:", encrypted_data)
  250. # 解密
  251. decrypted_text = decrypt_data(key, encrypted_data)
  252. print("Decrypted text:", decrypted_text)
  253. # 验证解密后的文本是否与原始明文相同
  254. assert plaintext == decrypted_text
  255. print("Encryption and decryption successful!")
  256. # Encrypted data: b'\x0f`\xdd\x95\x1bA\x1d.\xc7\x1d\xb6\xa1<60\xbf\xac\x99\x86\x92\x08\xc6@\xa5\x0c\xcc\x96\x00L>\x8f\x95\x03\xc5P\x8d\x11\xd0=\x14\xf6\xa5p\xf8\xc4\x141o'
  257. # Decrypted text: b'I love python very much'
  258. # Encryption and decryption successful!
  259. # 应用7:自定义协议
  260. def encode_message(data):
  261. # 将数据编码为字节
  262. data_bytes = data.encode('utf-8')
  263. # 计算消息长度,并转换为4字节的整数表示(如果需要支持更长的消息,应增加字节数)
  264. length = len(data_bytes).to_bytes(4, 'big')
  265. # 构建完整的消息:消息头(长度)+ 消息体
  266. message = bytearray(length) + bytearray(data_bytes)
  267. return message
  268. def decode_message(message_bytes):
  269. # 检查消息长度是否至少为4字节(消息头长度)
  270. if len(message_bytes) < 4:
  271. raise ValueError("消息太短,无法包含有效的标头!")
  272. # 提取消息头中的长度信息
  273. length = int.from_bytes(message_bytes[:4], 'big')
  274. # 检查消息体长度是否与头部指定的长度一致
  275. if len(message_bytes) != 4 + length:
  276. raise ValueError("消息正文长度与标头中指定的长度不匹配!")
  277. # 提取消息体
  278. data_bytes = message_bytes[4:4 + length]
  279. # 将字节解码为字符串
  280. data = data_bytes.decode('utf-8')
  281. return data
  282. # 主函数
  283. if __name__ == '__main__':
  284. # 编码和解码消息
  285. original_data = "Hello, Python!"
  286. encoded_message = encode_message(original_data)
  287. print("Encoded message:", encoded_message)
  288. decoded_data = decode_message(encoded_message)
  289. print("Decoded data:", decoded_data)
  290. # 验证解码后的数据是否与原始数据相同
  291. assert original_data == decoded_data
  292. print("Encoding and decoding successful!")
  293. # Encoded message: bytearray(b'\x00\x00\x00\x0eHello, Python!')
  294. # Decoded data: Hello, Python!
  295. # Encoding and decoding successful!
1-2、VBA:
  1. Rem 模拟Python中bytearray函数应用2:内存中的缓冲区(包括初始化、写入数据、读取数据、修改数据、追加数据、切片操作以及清空缓冲区)
  2. Sub TestRun_1()
  3. Dim buffer() As Byte
  4. Dim n As Byte, m As Byte
  5. Dim first_byte As Byte
  6. Dim sub_buffer() As Byte
  7. Dim i As Integer
  8. Dim j As Integer
  9. ' 初始化大小为10的缓冲区(索引从0到9)
  10. ReDim buffer(9)
  11. ' 填充缓冲区的前5个字节
  12. For n = 0 To 4
  13. buffer(n) = n + 1
  14. Next n
  15. ' 打印缓冲区内容
  16. Debug.Print "缓冲区内容:"
  17. For i = LBound(buffer) To UBound(buffer)
  18. If buffer(i) <> 0 Then
  19. Debug.Print Hex(buffer(i)),
  20. End If
  21. Next i
  22. Debug.Print
  23. ' 读取第一个字节
  24. first_byte = buffer(0)
  25. Debug.Print "第一个字节:", Hex(first_byte)
  26. ' 修改缓冲区的第4个字节
  27. buffer(3) = 6
  28. ' 打印修改后的缓冲区内容
  29. Debug.Print "修改后的缓冲区内容:"
  30. For i = LBound(buffer) To UBound(buffer)
  31. If buffer(i) <> 0 Then
  32. Debug.Print Hex(buffer(i)),
  33. End If
  34. Next i
  35. Debug.Print
  36. ' 在缓冲区末尾追加3个字节
  37. ReDim Preserve buffer(UBound(buffer) + 2)
  38. buffer(UBound(buffer) - 2) = 7
  39. buffer(UBound(buffer) - 1) = 8
  40. buffer(UBound(buffer)) = 9
  41. Next
  42. ' 打印追加数据后的缓冲区内容
  43. Debug.Print "追加数据后的缓冲区内容:"
  44. For i = LBound(buffer) To UBound(buffer)
  45. If buffer(i) <> 0 Then
  46. Debug.Print Hex(buffer(i)),
  47. End If
  48. Next i
  49. Debug.Print
  50. ' 创建子缓冲区并复制指定范围的数据
  51. ReDim sub_buffer(UBound(buffer) - LBound(buffer) - 3)
  52. j = 0
  53. For i = 2 To 5
  54. sub_buffer(j) = buffer(i)
  55. j = j + 1
  56. Next i
  57. ' 打印子缓冲区内容
  58. Debug.Print "子缓冲区内容:"
  59. For i = LBound(sub_buffer) To UBound(sub_buffer)
  60. Debug.Print Hex(sub_buffer(i)),
  61. Next i
  62. Debug.Print
  63. ' 打印缓冲区大小
  64. Debug.Print "缓冲区大小:", UBound(buffer) - LBound(buffer) + 1
  65. ' 清空缓冲区
  66. ReDim buffer(0)
  67. ' 打印清空后的缓冲区内容(实际上为空,无需循环打印)
  68. Debug.Print "清空后的缓冲区内容:"
  69. End Sub
  70. '缓冲区内容:
  71. '1 2 3 4 5
  72. '第一个字节: 1
  73. '修改后的缓冲区内容:
  74. '1 2 3 6 5
  75. '追加数据后的缓冲区内容:
  76. '1 2 3 6 5 7 8 9
  77. '子缓冲区内容:
  78. '3 6 5 0 0 0 0 0 0
  79. '缓冲区大小: 12
  80. '清空后的缓冲区内容:
  81. '

注意:1-2中的代码需粘贴到你的VBA编辑器中,按F5执行对应的Sub程序即可输出结果。 

2、相关文章:

2-1、 Python-VBA函数之旅-bin()函数

2-2、Python-VBA函数之旅-bool()函数 

2-3、Python-VBA函数之旅-bytes()函数 

2-4、Python-VBA函数之旅-callable()函数​​​​​​​ 

Python算法之旅:Algorithm

Python函数之旅:Function

个人主页:非风V非雨-CSDN博客

欢迎志同道合者一起交流学习,我的QQ:94509325/微信:

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览60120 人正在系统学习中
遨游码海,我心飞扬
微信名片
注:本文转载自blog.csdn.net的神奇夜光杯的文章"https://myelsa1024.blog.csdn.net/article/details/137591235"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top