如何在Python中处理字节数组的位,经十六进制转换获取整数、字符串与浮点数
在Python中处理字节数组并解析二进制数据
你已经完成了二进制文件到字节数组的读取,接下来可以通过struct模块(最便捷的方式)或手动位运算来解析不同类型的数据,以下是具体实现:
解析整数
使用struct模块(推荐)
struct模块可直接按指定字节序(大端/小端)和数据类型解析字节片段:
import struct # 示例:解析4字节大端无符号整数(对应十进制500) byte_arr = bytearray(b'\x00\x00\x01\xF4') num = struct.unpack(">I", byte_arr[0:4])[0] print(num) # 输出500
常用格式符说明:
>:大端字节序,<:小端字节序,=:本机字节序I:无符号32位整数,i:有符号32位整数,H:无符号16位整数,h:有符号16位整数,Q:无符号64位整数
手动位运算(适合理解底层逻辑)
若不想依赖struct,可通过移位和按位或拼接字节:
# 大端无符号32位整数 num = (byte_arr[0] << 24) | (byte_arr[1] << 16) | (byte_arr[2] << 8) | byte_arr[3] # 小端无符号32位整数(字节顺序反转) num = byte_arr[0] | (byte_arr[1] << 8) | (byte_arr[2] << 16) | (byte_arr[3] << 24)
解析字符串
根据字符串编码格式对字节片段解码即可,注意处理可能的终止符:
# 解析ASCII字符串(假设字节数组4-9位为ASCII内容) ascii_str = byte_arr[4:10].decode('ascii') # 解析UTF-8字符串,遇到\0终止 utf8_str = byte_arr[10:].split(b'\0')[0].decode('utf-8')
解析浮点数
浮点数遵循IEEE 754标准,用struct模块解析最可靠:
# 解析4字节大端单精度浮点数 float_val = struct.unpack(">f", byte_arr[14:18])[0] # 解析8字节大端双精度浮点数 double_val = struct.unpack(">d", byte_arr[18:26])[0]
字节数组的位操作
若需单独操作某个字节的特定位:
# 检查第2个字节(索引2)的第5位(从0开始计数) bit_5 = (byte_arr[2] >> 4) & 1 # 右移4位后取最后一位 # 设置第2个字节的第5位为1 byte_arr[2] |= (1 << 4) # 清除第2个字节的第5位 byte_arr[2] &= ~(1 << 4)
完整示例
假设二进制文件结构为:4字节大端无符号整数 + 6字节ASCII字符串 + 4字节大端单精度浮点数,完整解析代码:
import struct with open("data.bin", "rb") as f: byte_arr = bytearray(f.read()) # 解析整数 count = struct.unpack(">I", byte_arr[0:4])[0] # 解析字符串 name = byte_arr[4:10].decode('ascii') # 解析浮点数 price = struct.unpack(">f", byte_arr[10:14])[0] print(f"Count: {count}, Name: {name}, Price: {price:.2f}")
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

