首页 最新 热门 推荐

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

Python-VBA函数之旅-bytes函数

  • 25-03-03 04:24
  • 4217
  • 11985
blog.csdn.net

目录

1、bytes函数:

1-1、Python:

1-2、VBA:

2、相关文章:

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


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

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

2、网络编程:在网络编程中,经常需要将数据发送为字节对象。例如,可以使用socket模块将字节对象发送到远程服务器。

3、图像和音视频处理:当处理图像或音视频文件时,通常需要将文件读取为字节对象。然后可以使用各种库(如PIL)处理字节对象。

4、存储和序列化数据:当存储或序列化数据时,可以使用bytes()函数将数据转换为字节对象。然后可以将字节对象写入文件或将其作为消息传递到另一个进程。

5、加密与解密:在加密和解密算法中,字节操作是常见的。bytes()函数可以将字符串或其他数据类型转换为字节对象,以便进行加密或解密操作。

6、处理二进制协议:某些协议(例如,MQTT、WebSocket等)要求使用二进制格式进行通信。在这些情况下,我们需要使用bytes()来构建和解析消息。

        总之,在Python中,bytes()函数在许多涉及处理二进制数据的场景中都很有用。

1、bytes函数:
1-1、Python:
  1. # 1.函数:bytes
  2. # 2.功能:用于处理不可变字节序列,即创建不可修改的字节数组
  3. # 3.语法:bytes(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(bytes("myelsa"))
  41. # 6-2、如果参数source为可迭代对象,那么可迭代对象的元素必须为0-255的范围内的整数,否则将抛出异常。详情如下:
  42. # ValueError: byte must be in range(0, 256)
  43. # print(bytes([1024, 8, 6]))
  44. # TypeError: 'float' object cannot be interpreted as an integer
  45. # print(bytes([3.14, 1.5, 6.0]))
  46. # 6-3、bytearray()函数与bytes()函数的主要区别:前者产生的对象元素可以修改,而后者不能修改
  47. # 6-4、如果参数source为符合缓冲区接口的对象,则将使用只读方式将字节读取到字节数组后返回
  48. # 7.示例:
  49. # 应用1:二进制数据处理
  50. # 创建一个字节对象
  51. binary_data = bytes([0x01, 0x02, 0x03, 0x04])
  52. print("原始二进制数据:", binary_data)
  53. # 转换整数为字节
  54. integer_value = 12345
  55. # 将整数转换为4字节长度的bytes对象(大端字节序)
  56. integer_bytes = integer_value.to_bytes(4, byteorder='big')
  57. print("整数转换的二进制数据:", integer_bytes)
  58. # 将字符串转换为字节(编码为UTF-8)
  59. text = "Hello, Python!"
  60. text_bytes = text.encode('utf-8')
  61. print("字符串转换的二进制数据:", text_bytes)
  62. # 将字节对象解码回字符串
  63. decoded_text = text_bytes.decode('utf-8')
  64. print("解码后的字符串:", decoded_text)
  65. # 使用bytes函数和列表推导式创建一个特定模式的字节序列
  66. pattern_bytes = bytes([i % 256 for i in range(10)])
  67. print("模式二进制数据:", pattern_bytes)
  68. # 将bytes对象转换为十六进制表示
  69. hex_string = pattern_bytes.hex()
  70. print("十六进制表示:", hex_string)
  71. # 将十六进制字符串转换回bytes对象
  72. back_to_bytes = bytes.fromhex(hex_string)
  73. print("转换回bytes对象:", back_to_bytes)
  74. # 切片和连接bytes对象
  75. first_half = binary_data[:2]
  76. second_half = binary_data[2:]
  77. concatenated = first_half + second_half
  78. print("切片和连接后的数据:", concatenated)
  79. # 遍历bytes对象
  80. for byte in binary_data:
  81. print(f"字节值: {byte}")
  82. # 原始二进制数据: b'\x01\x02\x03\x04'
  83. # 整数转换的二进制数据: b'\x00\x0009'
  84. # 字符串转换的二进制数据: b'Hello, Python!'
  85. # 解码后的字符串: Hello, Python!
  86. # 模式二进制数据: b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t'
  87. # 十六进制表示: 00010203040506070809
  88. # 转换回bytes对象: b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t'
  89. # 切片和连接后的数据: b'\x01\x02\x03\x04'
  90. # 字节值: 1
  91. # 字节值: 2
  92. # 字节值: 3
  93. # 字节值: 4
  94. # 应用2:网络编程
  95. import socket
  96. # 服务器端代码
  97. # 创建 TCP/IP 套接字
  98. server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  99. # 获取本地主机名
  100. host = socket.gethostname()
  101. # 设置端口号
  102. port = 12345
  103. # 绑定端口号
  104. server_socket.bind((host, port))
  105. # 设置最大连接数,超过后排队
  106. server_socket.listen(5)
  107. while True:
  108. # 建立客户端连接
  109. client_socket, addr = server_socket.accept()
  110. print(f"连接地址: {addr}")
  111. # 接收 1024 字节的数据
  112. data = client_socket.recv(1024)
  113. # 打印接收到的数据
  114. print(f"接收到的数据: {data.decode('utf-8')}")
  115. # 发送响应数据
  116. response = "已收到消息".encode('utf-8')
  117. client_socket.sendall(response)
  118. # 关闭连接
  119. client_socket.close()
  120. # 客户端代码
  121. # 创建 TCP/IP 套接字
  122. client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  123. # 设置服务器地址和端口号
  124. server_address = ('localhost', 12345)
  125. # 连接到服务器
  126. client_socket.connect(server_address)
  127. # 发送数据
  128. message = "你好,服务器!".encode('utf-8')
  129. client_socket.sendall(message)
  130. # 接收服务器响应
  131. data = client_socket.recv(1024)
  132. # 打印接收到的响应
  133. print(f"接收到的响应: {data.decode('utf-8')}")
  134. # 关闭连接
  135. client_socket.close()
  136. # 应用3:图像和音视频处理(注意:运行此程序,需要确保已经安装了pillow库)
  137. import os
  138. from PIL import Image
  139. def read_image_as_bytes(image_path):
  140. with open(image_path, 'rb') as file:
  141. image_bytes = file.read()
  142. return image_bytes
  143. # 读取图像并显示
  144. def display_image(image_path):
  145. image = Image.open(image_path)
  146. image.show()
  147. # 假设你有一个处理 bytes 对象的函数
  148. def process_image_bytes(image_bytes):
  149. # 这里应该是对 bytes 对象的实际处理逻辑
  150. # 例如,你可以将 bytes 对象发送到另一个函数或通过网络发送
  151. # 但为了示例,我们只是打印其长度
  152. print(f"Received {len(image_bytes)} bytes of image data.")
  153. # ... 实际处理代码 ...
  154. if __name__ == '__main__':
  155. # 图像文件路径
  156. image_path = 'input.jpg'
  157. # 确保文件存在
  158. if os.path.exists(image_path):
  159. # 读取图像为 bytes 对象
  160. image_data = read_image_as_bytes(image_path)
  161. display_image(image_path)
  162. # 处理 bytes 对象
  163. process_image_bytes(image_data)
  164. else:
  165. print(f"File {image_path} does not exist.")
  166. # Received 151245 bytes of image data.
  167. # 显示图像文件
  168. # 应用4:存储和序列化数据
  169. import pickle
  170. # 定义一个简单的数据结构
  171. data = {
  172. 'name': 'Myelsa',
  173. 'age': 42,
  174. 'city': 'Guangzhou'
  175. }
  176. # 序列化数据为bytes对象
  177. serialized_data = pickle.dumps(data)
  178. print(f"序列化后的bytes对象: {serialized_data}")
  179. # 反序列化bytes对象为原始数据结构
  180. deserialized_data = pickle.loads(serialized_data)
  181. print(f"反序列化后的数据: {deserialized_data}")
  182. # 验证反序列化后的数据是否与原始数据相同
  183. assert data == deserialized_data, "数据不一致"
  184. print("数据验证成功!")
  185. # 序列化后的bytes对象: b'\x80\x04\x950\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x06Myelsa\x94\x8c\x03age\x94K*\x8c\x04city\x94\x8c\tGuangzhou\x94u.'
  186. # 反序列化后的数据: {'name': 'Myelsa', 'age': 42, 'city': 'Guangzhou'}
  187. # 数据验证成功!
  188. # 应用5:加密与解密
  189. from cryptography.hazmat.backends import default_backend
  190. from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
  191. from cryptography.hazmat.primitives import padding
  192. from base64 import b64encode, b64decode
  193. # 生成一个随机的AES密钥,长度通常为16、24或32字节
  194. key = b'Sixteen byte key'
  195. # 初始化一个填充器对象,用于在加密前填充数据,并在解密后去除填充
  196. padder = padding.PKCS7(128).padder()
  197. unpadder = padding.PKCS7(128).unpadder()
  198. def encrypt_data(data: bytes, key: bytes) -> bytes:
  199. # 填充数据
  200. padded_data = padder.update(data) + padder.finalize()
  201. # 创建一个Cipher对象
  202. cipher = Cipher(algorithms.AES(key), modes.CBC(b'\x00' * 16), backend=default_backend())
  203. # 创建一个加密器对象
  204. encryptor = cipher.encryptor()
  205. # 加密数据
  206. ciphertext = encryptor.update(padded_data) + encryptor.finalize()
  207. # 为了便于存储或传输,可以将bytes对象转换为base64编码的字符串
  208. return b64encode(ciphertext)
  209. def decrypt_data(ciphertext: bytes, key: bytes) -> bytes:
  210. # 如果ciphertext是base64编码的字符串,先解码为bytes对象
  211. ciphertext = b64decode(ciphertext)
  212. # 创建一个Cipher对象
  213. cipher = Cipher(algorithms.AES(key), modes.CBC(b'\x00' * 16), backend=default_backend())
  214. # 创建一个解密器对象
  215. decryptor = cipher.decryptor()
  216. # 解密数据
  217. decrypted_padded_data = decryptor.update(ciphertext) + decryptor.finalize()
  218. # 去除填充
  219. decrypted_data = unpadder.update(decrypted_padded_data) + unpadder.finalize()
  220. return decrypted_data
  221. if __name__ == '__main__':
  222. # 明文消息,必须是bytes类型
  223. plain_text = b'I love python!'
  224. # 加密数据
  225. encrypted_text = encrypt_data(plain_text, key)
  226. print(f"Encrypted text: {encrypted_text}")
  227. # 解密数据
  228. decrypted_text = decrypt_data(encrypted_text, key)
  229. print(f"Decrypted text: {decrypted_text}")
  230. # 验证解密后的数据是否与原始数据相同
  231. assert plain_text == decrypted_text, "加密和解密后数据不一致!"
  232. print("数据验证成功!")
  233. # Encrypted text: b'AiDb6dB5orehw8J1bzeX8Q=='
  234. # Decrypted text: b'I love python!'
  235. # 数据验证成功!
  236. # 应用6:处理二进制协议
  237. import struct
  238. def encode_binary_protocol(data: bytes) -> bytes:
  239. # 计算数据的长度
  240. length = len(data)
  241. # 使用struct模块将长度编码为两个字节(大端序)
  242. length_bytes = struct.pack('>H', length)
  243. # 将长度和数据拼接起来形成完整的协议数据包
  244. protocol_packet = length_bytes + data
  245. return protocol_packet
  246. def decode_binary_protocol(protocol_packet: bytes) -> bytes:
  247. # 从协议数据包中提取前两个字节作为长度
  248. length_bytes = protocol_packet[:2]
  249. # 使用struct模块解码长度
  250. length = struct.unpack('>H', length_bytes)[0]
  251. # 检查数据包长度是否匹配实际长度
  252. if length != len(protocol_packet) - 2:
  253. raise ValueError("Protocol packet length does not match the encoded length")
  254. # 提取数据部分
  255. data = protocol_packet[2:]
  256. # 返回数据部分
  257. return data
  258. if __name__ == '__main__':
  259. # 明文消息,必须是bytes类型
  260. original_data = b'Hello, python!'
  261. encoded_data = encode_binary_protocol(original_data)
  262. print(f"Encoded data: {encoded_data}")
  263. decoded_data = decode_binary_protocol(encoded_data)
  264. print(f"Decoded data: {decoded_data}")
  265. # 验证数据是否一致
  266. assert original_data == decoded_data, "编码和解码后的数据不一致!"
  267. print("数据验证成功!")
  268. # Encoded data: b'\x00\x0eHello, python!'
  269. # Decoded data: b'Hello, python!'
  270. # 数据验证成功!
1-2、VBA:
VBA很难模拟类似场景,略。
2、相关文章:

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

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

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

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

Python算法之旅:Algorithm

Python函数之旅:Function

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

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

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

/ 登录

评论记录:

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

分类栏目

后端 (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