Python中二进制数据处理的实用教程
很多朋友对于Python中二进制数据处理的实用教程和不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
一、二进制数据处理基础
1.1 bytes与bytearray类型
基本功能比较:
字节- 不变序列b=b'python'前缀b表示字节打印的字面大小(b [0])80(ascii'p')b [0]=65报告错误,bytable bytearray -bytearray -bytearray -baiby sequence ba=ba=ba=ba=ba bytearray(ba ba ba)ba [0] Bytearray(B'Aython')表1:比较字节和bytearray
特征
字节
Bytearray
可变性
不变
多变的
记忆效率
更高
稍低一点
使用方案
数据存储,网络传输
数据修改,缓冲区
哈希支持
支持
不支持
语法表示
B'.'
bytearray(b'.')
1.2 二进制与文本转换
编码和解码:
文本到二进制文本='Hello world'binary=text.encode('utf-8')b'\ xe4 \ xbd \ xa0 \ xa0 \ xe5 \ xa5 \ xbd \ xbd \ xe4 \ xb8 \ x96 \ x96 \ x96 \ xe7 \ xe7 \ xe7 \ x95 \ x95 \ x95 \ x95 \ x8c'bily thret horly=billy=billy=billy.8'错误处理b'invalid \ xff'.decode('utf-8',errors='replact')'ivevalid'常见编码方案:
UTF-8:通用Unicode编码ASCII:基本英语字符拉丁1:ISO-8859-1编码GBK:中文编码
二、struct模块 - 结构化二进制数据
2.1 基本打包与解包
格式字符串字符串语法:
导入结构包装数据包装=struct.pack('hhl',1,2,3)代表大型订单,h=short(2b),l=long(4b)uncected data unwacked unwacked=struct.unpack('hhl',包装)
特点
类型c
Python类型
字节数
x
填写字节
-
1
b
签名的字符
int
1
b
未签名的char
int
1
h
短的
int
2
h
未签名的短
int
2
我
int
int
4
我
未签名的int
int
4
f
漂浮
漂浮
4
d
双倍的
漂浮
8
2.2 实际应用案例
解析BMP文件标头:
def parse_bmp_header(fileName):''''解析BMP文件标头信息''''带有open(fileName,'rb')at f:读取第一个14个字节文件header file_header=f.read(14) data_offset=struct.unpack('2sihhi',file_header)unwake Information标头(header_size,宽度,高度,飞机,bits_per_pixel,compression,compression,compression,image_size,x_res,y_res,y_res,y_res,colors_used_used_used,estignts_colors,estignts_colors) 'file_type': 'BMP', 'file_size': file_size, 'width': width, 'height': height, 'bits_per_pixel': bits_per_pixel, 'compression': compression, 'colors_used': colors_used }BMP file structure diagram
三、内存视图与缓冲区
3.1 memoryview对象
图像数据处理:
def process_image_buffer(image_data):'''''使用内存处理图像数据''''''''''太短,不是有效的BMP文件')如果MV [:2]!=B'BM':升级值('不是有效的BMP文件')获取图像宽度和高度宽度=int.from_bytes(MV [18333333333:22],''in Int.from_bytes, int.from_bytes(MV [22:26],'Little')返回图像信息返回{'width':宽度,'高度':高度,'data_size': len(mv)
四、二进制数据高级处理
基本位操作:
设置位def set_bit(值,位):返回值| (1 bit)# Clear bit def clear_bit(value, bit): return value ~(1 bit)# Check bit def check_bit(value, bit): return (value bit) 1# Bit mask application RGBA_MASK=0xFF000000 # Alpha channel mask RED_MASK=0x00FF0000 # Red channel mask def extract_color_channels(color): ''' Extract each channel from the 32位颜色值'''''
类Binary -ProtocolParser:''二进制协议解析器''''def __init __(self,data): self.data=memoryView(data)self.offset=0 def_uint8(self) little_endian=True): fmt='H' if little_endian else 'H' value=struct.unpack_from(fmt, self.data, self.offset)[0] self.offset +=2 return value def read_bytes(self, length): value=self.data[self.offset:self.offset+length] self.offset +=length return字节(value)def skip(self,engent): self.offset +=长度def剩余(self):返回len(self.data) - self.offsetexampleexample数据=b'\ x01 \ x00 \ x02 \ x02 \ x03 \ x03 \ x03 \ x04 \ x04 \ x05 \ x05 \ x05 \ x06'parser=x05 \ x06'parser=x05 \ x05 \ x06'parser=binary-protocolParser(数据)打印(parser.read_uint8())1print(parser.read_uint16())2(0x0002)print(parser.read_bytes(3)
def parse_ip_header(数据包):''''parse ip协议标题''' dest_addr)=struct.unpack('!BBHHHBBH4s4s', packet[:20]) # parse version and header length version=version_ihl 4 ihl=(version_ihl0x0F) * 4 # parse flags and slice offset flags=flags_fragment 13 fragment_offset=flags_fragment0x1FFF # convert IP address src_ip='。'。在src_addr中为b的join(str(b))dest_ip='。'。join(str(b)for b in dest_addr中的b)返回{'version':版本,'header_length': ihl,'total_length': tate 'destination_ip': dest_ip,'ttl': ttl,'flags': flags,'fragment_offset': fragment_offset} :01
4.1 位操作与掩码
def invert_bmp_colors(input_file,output_file):'''''invert bmp image color''''with open(input_file,'rb')at f:读取整个文件dation=bytearray(f.read Read(f.read)) valueError('不是有效的BMP文件')获取像素数据偏移PIXEL_OFFSET=struct.unpack_from('i',data,10)[0]inver color(bgr格式)in range(pixel_offset,pixel_offset,len(len(data)):数据[i]=255-数据[I] F: F.Write(数据)
4.2 二进制协议解析
五、实际应用案例
有效数据处理:
def process_large_binary_file(fileName):''''大型二进制文件''''''''带有open(fileName,'rb')作为f:使用内存映射避免使用mmap.mmap.mmap(f.fileleno(f.fileno(F.F.F.F.F.F.F.File)(0,access=mmmap.access_read),MMAP.CESS_READ VIEVER=MMMAP.ACCESS_READ VIEVER=MMMAP.ASMREAD VIEVE=MMMAP.ASMREAD) memoryView(mm)过程文件标头=parse_header(MV [:100])chunk_size中的过程数据=4096 in range(100,len(mv),chunk_size,chunk_size):块
方法
优势
缺点
适用的方案
直接操作字节
简单而直观
记忆效率低
小数据量
MemoryView
需要Python 3.3+
大数据切片
mmap
内存映射的大文件
系统依赖性
超大文件
结构预编译
快速解析速度
需要预定格式
固定格式数据
并行处理
利用多核
增加复杂性
CPU密集任务
5.1 网络封包处理
边界检查:始终验证数据长度类型验证:检查输入数据类型内存安全性:避免缓冲区溢出数据验证:检查魔术数字和校验和检查异常处理:正确处理损坏的数据安全分析示例:
def safe_parse_packet(数据包):''安全数据包解析'''' {min_packet_size} byt是必需的')try:如果数据包[:4]!=b'\ x01 \ x02 \ x03 \ x04': caft valueError('Invalid captsectssum'iffaceSum ifcarce_checkssscect 33 30=b'\ x01 \ x02 \ x02 \ x02 \ x04': valueError(“校验和失败”)分析数据返回PARSE_PACKET_CONTENT(数据包)除struct.error as e: a in
5.2 图像像素处理
python froun at a in e:提高valueerror('pack format error')python提供了丰富的二元数据处理工具:
基本类型:字节和bytearray满足基本需求结构化处理:结构模块处理固定格式数据大文件处理:MMAP实现内存映射协议分析:位操作和掩码提取现场练习建议:
优先使用内存视图来减少记忆复制预编译的结构格式以提高性能,以添加足够的安全检查和使用内存映射或流式传输复杂协议的大型文件的例外处理来考虑通过学习本教程的特殊解析库考虑使用特殊的解析库,我们可以:
精通各种二进制数据格式的解析。实施常见的二进制文件和协议以实现高性能二进制数据处理。编写安全的二进制数据分析代码。
编程python#record我的2025在头条新闻
用户评论
终于找到一篇讲二进制处理的Python教程了!我一直想深入了解这个方面,现在有机会好好学习一下,感谢作者分享!
有18位网友表示赞同!
太棒了!正好最近在遇到一些工作需要用到二进制操作,这篇教程解决了很多我的疑问,入门级的解释很清晰易懂。
有7位网友表示赞同!
以前感觉Python主要用于Web开发之类,没想到它还能处理二进制数据!学习这方面知识确实很有实用价值,我会仔细跟着教程一步步实践。
有6位网友表示赞同!
作者说得对,掌握了二进制操作技巧,编程效率可以大大提高。之前遇到一些文件读写问题,后来才发现可以用Python的二进制模式来解决,真的太神奇了!
有16位网友表示赞同!
教程讲得确实不错,但针对不同场景的应用例子可能再多些?例如处理图像数据、音频数据等等,这样更能体现二进制处理的强大功能。
有18位网友表示赞同!
这个教程太基础了,根本没有介绍一些高级的二进制操作技巧比如位运算和字节流啊!希望能作者再分享更多深入的内容。
有14位网友表示赞同!
我觉得这篇文章对于初学者来说还是很有帮助,但是有些地方表达比较简单,缺乏足够的细节解释,对有一定编程经验的人来说可能不太满足。
有6位网友表示赞同!
Python处理二进制数据确实很方便,代码简洁明了,学习起来比其他语言要容易许多!
有5位网友表示赞同!
这篇教程讲解的重点好像偏重于理论层面,实践操作的指导性相对不足。希望能配合一些实操案例,让读者更容易理解和掌握。
有13位网友表示赞同!
感谢作者分享这份宝贵资源!二进制处理一直是我的痛点,这次终于找到了一篇可信赖的教程学习了!
有16位网友表示赞同!
我觉得教程讲得很仔细,每个步骤都清晰易懂,尤其喜欢作者对常见错误的讲解和解决方案,非常实用!
有15位网友表示赞同!
我感觉Python的二进制处理特性确实很有潜力,但这种操作相对复杂,需要经过多次练习才能熟练掌握。希望能有更多实战案例分享,以便快速提升技能水平。
有11位网友表示赞同!
这个教程对我很友好!以前一直想学习二进制操作,却害怕太过复杂和深奥,这篇文字解释很清晰,让我更加自信地去实践了 :)
有19位网友表示赞同!
希望这个教程可以多介绍几种不同类型的二进制数据处理方法,例如压缩、加密等,这样能更全面地了解Python的二进制处理功能。
有15位网友表示赞同!
作者真是太厉害了!能够把复杂的二进制理论用通俗易懂的语言讲解出来,简直是福音啊!我一定要认真学习这篇教程!
有11位网友表示赞同!
Python处理二进制数据的效率真的令人难以置信! 我之前尝试过其他语言,发现Python的速度要快很多,而且代码也很简洁易懂。
有9位网友表示赞同!
教程内容很棒,能够帮助我更好地理解Python的二进制处理基础知识。希望作者可以继续更新更多高级内容,助推我更深入的学习。
有11位网友表示赞同!