Python解析二进制数据全攻略

上周调试网络协议时,我突然发现同事传过来的数据包像天书——原来他直接发了原始二进制流。这让我想起刚入行时面对十六进制数字的手足无措。今天就让我们用Python这把瑞士军刀,切开二进制数据的神秘外壳。

一、认识二进制世界的基石

记得第一次用记事本打开JPG图片时,满屏乱码让我以为电脑中了病毒。其实计算机存储的01序列,就像乐高积木般充满可能性。

1.1 字节与字符串的量子纠缠

  • bytes:不可变的字节序列,适合存储原始数据
  • bytearray:可变的亲兄弟,适合动态修改
  • 内存视图:像X光一样透视数据底层

试试在控制台输入:

b'\\x68\\x65\\x6c\\x6c\\x6f'.decode('utf-8')

你会看到熟悉的"hello"蹦出来,这就是字节与字符的魔法转换。

1.2 常用工具库对比

模块适用场景性能
struct处理C结构体★★★★☆
array数值型批量处理★★★☆☆
bitstring位级操作★★☆☆☆

二、文件操作的两种面孔

上周我误删了服务器日志,幸亏有二进制备份。让我们看看Python如何驾驭这两种模式:

2.1 文本模式下的陷阱

  • 自动处理换行符转换
  • 遇到0x1A(Ctrl+Z)会提前终止读取
  • 处理JPEG等二进制文件必定出错

2.2 二进制模式实战

with open('photo.jpg', 'rb') as f:header = f.read(4)if header == b'\\xff\\xd8\\xff\\xe0':print("这是标准的JPEG文件")

这样的文件头检查,比文件扩展名可靠得多。

Python解析二进制数据全攻略

三、结构体处理:与C语言的无缝对接

记得第一次解析TCP头部的痛苦吗?struct模块就是为此而生。

3.1 格式字符串速记表

符号类型字节数
B无符号字节1
Hunsigned short2
Iunsigned int4
Qunsigned long long8

解析IPv4数据包示例:

import structpacket = b'\\x45\\x00\\x00\\x3c\\x00\\x00\\x40\\x00\\x40...'version_ihl = packetversion = version_ihl >> 4ihl = version_ihl & 0x0Ftotal_length, = struct.unpack_from('!H', packet, 2)

四、加密解密:数据的安全铠甲

上个月公司数据泄露事件让我意识到,加密不是可选项而是必选项。

4.1 哈希校验实践

import hashlibdef verify_file(path):hasher = hashlib.sha256with open(path, 'rb') as f:while chunk := f.read(4096):hasher.update(chunk)return hasher.hexdigest

4.2 AES加密实战

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modeskey = os.urandom(32)iv = os.urandom(16)cipher = Cipher(algorithms.AES(key), modes.CBC(iv))加密encryptor = cipher.encryptorct = encryptor.update(b"Secret message") + encryptor.finalize解密decryptor = cipher.decryptordecryptor.update(ct) + decryptor.finalize

五、性能优化:与内存共舞

处理10GB的日志文件时,我的旧电脑差点。这些技巧让它起死回生:

  • 使用memoryview避免数据拷贝
  • 预分配bytearray空间
  • 分块处理大文件

比如处理图像时:

def invert_colors(data):view = memoryview(data)for i in range(len(view)):view[i] = 255view[i]return view.obj

窗外天色渐暗,显示屏上的十六进制数字依然在跳动。保存好刚写完的协议解析器,咖啡杯上的水渍在键盘反光中泛着微光。二进制世界的大门已然敞开,接下来的奇妙旅程,等你亲自去探索。

郑重声明:以上内容均源自于网络,内容仅用于个人学习、研究或者公益分享,非商业用途,如若侵犯到您的权益,请联系删除,客服QQ:841144146
相关推荐