You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 23:37:45