python进行二进制数据处理的方法

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: python进行二进制数据处理的方法

方法一:

使用struct模块,特点轻量化,简单易用。缺点就是可读性不是太好,使用小数据临时使用一下,对于大量的数据解析,写起来比较繁琐,显得有点力不从心。

import struct

data = b'\x92\xaa\xbb\xcc\x11\x22\x33\x44'
a,b,c,d,e = struct.unpack(">BBBBI", data)
print("a=0x%x b=0x%x c=0x%x d=0x%x e=0x%x"%(a,b,c,d,e))
packData = struct.pack(">BBBBI", a, b, c, d, e)
print("packData: %s"%packData)

上面的程序会按照给定的格式一次解析数据,得到的输出结果如下:

注:建议采用python3运行,python2不区分bytes和string类型,通过struct.pack()得到的结果为字符串类型,会打印出乱码。

a=0x92 b=0xaa c=0xbb d=0xcc e=0x11223344
packData: b'\x92\xaa\xbb\xcc\x11"3D'

可以看出,能够正确的解析和组装出需要的的数据。

struct常用函数原型如下:
struct的方法 |说明
:---|:---
pack(fmt, v1, v2…) |按照fmt指定的格式化要求,格式化v1,v2等后续参数,返回bytes类型
unpack(fmt, BytesData)| 按照fmt指定的格式要求,解析出bytesData里面的数据内容,返回的是数据元组
pack_from(fmt, BytesData, offset)| 按照fmt指定的格式要求,解析后面的内容,从offset处开始解析,返回的是数据元组

这个里面的fmt表示格式化字符串,由两个部分组成,第一部分为指定大小端格式,第二部分是依次解析的格式。

大小端格式字符 说明 .
> 大端模式 和阅读顺序一致,高字节在前(内存地址小),低字节在后(地址大)。
< 小端模式 和大端相反,高字节在后(内存地址大),低字节在前面(地址小)。
@或者= 主机默认字节序 和主机系统强相关,X86/X64默认为小段模式。其中@还会强制4字节对齐。

解析格式如下:

格式字符 ctypes类型 字节数
c c_char 1
b c_byte 1
B c_ubyte 1
h c_short 2
H c_ushort 2
i c_int 4
I c_uint 4
q c_longlong 8
Q c_ulonglong 8
f c_float 4
d c_double 8
p c_char_p 4(64位系统为8)
P c_void_p 4(64位系统为8)
x c_ubyte(占位padding字节) 1

方法二:

使用ctypes模块高效的解析组装二进制数据,这种方法和C比较类似,也更为强大。

import ctypes

class TestBig_Struct(ctypes.BigEndianStructure):
    _fields_=[
        ('b1', ctypes.c_ubyte,1),
        ('b2', ctypes.c_ubyte,1),
        ('b3', ctypes.c_ubyte,1),
        ('b4', ctypes.c_ubyte,1),
        ('lev',ctypes.c_ubyte,4),
        ('BB', ctypes.c_ubyte),
        ('BC', ctypes.c_ubyte),
        ('BD', ctypes.c_ubyte),
        ('SS', ctypes.c_ushort),
    ]


class Test_Struct(ctypes.Structure):
    _fields_=[
        ('b1', ctypes.c_ubyte, 1),
        ('b2', ctypes.c_ubyte, 1),
        ('b3', ctypes.c_ubyte, 1),
        ('b4', ctypes.c_ubyte, 1),
        ('lev',ctypes.c_ubyte, 4),
        ('BB', ctypes.c_ubyte),
        ('BC', ctypes.c_ubyte),
        ('BD', ctypes.c_ubyte),
        ('SS', ctypes.c_ushort),
    ]
#学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
if __name__ == '__main__':
    test = Test_Struct();
    test.b1 = 1;
    test.b2 = 0;
    test.b3 = 0;
    test.b4 = 1;
    test.lev = 2;
    test.BB = 0xAA;
    test.BC = 0xBB;
    test.BD = 0xCC;
    test.SS = 0xEEFF;
    print ("defEndian", ctypes.string_at(ctypes.addressof(test), ctypes.sizeof(test)))
    test = TestBig_Struct();
    test.b1 = 1;
    test.b2 = 0;
    test.b3 = 0;
    test.b4 = 1;
    test.lev = 2;
    test.BB = 0xAA;
    test.BC = 0xBB;
    test.BD = 0xCC;
    test.SS = 0xEEFF;
    print ("BigEndian", ctypes.string_at(ctypes.addressof(test), ctypes.sizeof(test)))
    ctypes.memmove(ctypes.addressof(test), b'\x92\xaa\xbb\xcc\xee\xff', ctypes.sizeof(test));
    print ("b1:%x"%test.b1)
    print ("b2:%x"%test.b2)
    print ("b3:%x"%test.b3)
    print ("b4:%x"%test.b4)
    print ("lev:%x"%test.lev)
    print ("BB:%x"%test.BB)
    print ("BC:%x"%test.BC)
    print ("BD:%x"%test.BD)
    print ("SS:%x"%test.SS)
    with open("out.bin", "wb") as f:
        f.write(ctypes.string_at(ctypes.addressof(test), ctypes.sizeof(test)));

从上面的实例,可以看出来,这个就是采用类似与C结构体的方式,直接解析映射来解析和组装数据。十分的强大。这个实例程序的运行结果如下。

defEndian b')\xaa\xbb\xcc\xff\xee'
BigEndian b'\x92\xaa\xbb\xcc\xee\xff'
b1:1
b2:0
b3:0
b4:1
lev:2
BB:aa
BC:bb
BD:cc
SS:eeff

其中out.bin文件中保存的数据,以十六进制查看如下:

92 aa bb cc ee ff
相关文章
|
3天前
|
数据采集 存储 数据挖掘
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第27天】在数据分析领域,Python的Pandas库因其强大的数据处理能力而备受青睐。本文介绍了Pandas在数据导入、清洗、转换、聚合、时间序列分析和数据合并等方面的高效技巧,帮助数据分析师快速处理复杂数据集,提高工作效率。
16 0
|
21天前
|
测试技术 API Python
【10月更文挑战第1天】python知识点100篇系列(13)-几种方法让你的电脑一直在工作
【10月更文挑战第1天】 本文介绍了如何通过Python自动操作鼠标或键盘使电脑保持活跃状态,避免自动息屏。提供了三种方法:1) 使用PyAutoGUI,通过安装pip工具并执行`pip install pyautogui`安装,利用`moveRel()`方法定时移动鼠标;2) 使用Pymouse,通过`pip install pyuserinput`安装,采用`move()`方法移动鼠标绝对位置;3) 使用PyKeyboard,同样需安装pyuserinput,模拟键盘操作。文中推荐使用PyAutoGUI,因其功能丰富且文档详尽。
WK
|
8天前
|
Python
Python中format_map()方法
在Python中,`format_map()`方法用于使用字典格式化字符串。它接受一个字典作为参数,用字典中的键值对替换字符串中的占位符。此方法适用于从字典动态获取值的场景,尤其在处理大量替换值时更为清晰和方便。
WK
63 36
|
12天前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
19天前
|
机器学习/深度学习 数据采集 数据挖掘
11种经典时间序列预测方法:理论、Python实现与应用
本文将总结11种经典的时间序列预测方法,并提供它们在Python中的实现示例。
56 2
11种经典时间序列预测方法:理论、Python实现与应用
|
3天前
|
存储 数据处理 Python
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第27天】在科学计算和数据分析领域,Python凭借简洁的语法和强大的库支持广受欢迎。NumPy和SciPy作为Python科学计算的两大基石,提供了高效的数据处理和分析工具。NumPy的核心功能是N维数组对象(ndarray),支持高效的大型数据集操作;SciPy则在此基础上提供了线性代数、信号处理、优化和统计分析等多种科学计算工具。结合使用NumPy和SciPy,可以显著提升数据处理和分析的效率,使Python成为科学计算和数据分析的首选语言。
13 3
|
4天前
|
存储 机器学习/深度学习 算法
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第26天】NumPy和SciPy是Python科学计算领域的两大核心库。NumPy提供高效的多维数组对象和丰富的数学函数,而SciPy则在此基础上提供了更多高级的科学计算功能,如数值积分、优化和统计等。两者结合使Python在科学计算中具有极高的效率和广泛的应用。
13 2
|
4天前
|
存储 数据挖掘 数据处理
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第26天】Python 是数据分析领域的热门语言,Pandas 库以其高效的数据处理功能成为数据科学家的利器。本文介绍 Pandas 在数据读取、筛选、分组、转换和合并等方面的高效技巧,并通过示例代码展示其实际应用。
16 1
|
15天前
|
开发者 Python
Python中的魔法方法与运算符重载
在Python的奇妙世界里,魔法方法(Magic Methods)和运算符重载(Operator Overloading)是两个强大的特性,它们允许开发者以更自然、更直观的方式操作对象。本文将深入探讨这些概念,并通过实例展示如何利用它们来增强代码的可读性和表达力。
|
18天前
|
数据采集 数据可视化 数据挖掘
使用Python进行数据处理与可视化——以气温数据分析为例
【10月更文挑战第12天】使用Python进行数据处理与可视化——以气温数据分析为例
135 0