首页 > 编程语言 >python进行二进制数据处理的方法

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

时间:2023-12-19 19:12:05浏览次数:38  
标签:BB python print 二进制 ctypes 数据处理 test ubyte 解析

方法一:

使用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

标签:BB,python,print,二进制,ctypes,数据处理,test,ubyte,解析
From: https://www.cnblogs.com/Pythonmiss/p/17914486.html

相关文章

  • python中导入模块/包的几种方式
    一、模块的导入方式模块就是.py类型的Python文件导入时不需要.py后缀,直接导入文件名即可1.利用import直接导入:语法:importmodule_name使用方式:module_name.class_name或者module.func_name2.利用import导入模块并设置一个别名语法:importmodule_nameasXXX使用方式:XXX.cl......
  • Python字典中 fromkeys()方法的坑
    fromkeys()方法类似于列表的浅拷贝首先用该方法创建一个字典dict_=dict.fromkeys(('a','b','c','d'),[])print(dict_)输出:{'a':[],'b':[],'c':[],'d':[]}当我向某个key添加value时,问题出现了dict_['b......
  • Python图像处理自动化:批量去除图片背景
    一、前言现在有较多的图片需要处理,需要将每张图片都去除背景。通常,我们使用像Photoshop这样的专业抠图软件或者在线抠图网页来处理,但这些方法通常只能一张一张地手动操作,效率低下。接下来将介绍使用Python批量处理,一键去除文件夹中所有图片的背景,从而大大提高工作效率。二、Python......
  • python代码自动打开浏览器并输入相应的内容后搜索
    需求描述:使用python代码实现自动打开浏览器,之后进入百度,输入‘小姐姐’,查看结果1.安装selenium,直接安装4.0版本。pipinstallselenium==4.0看到successful字样就安装成功了2.代码实现#@File:自动化测试.py#author:蜜蜂#Time:2023/12/1917:06importtimefromseleniumimpo......
  • opencv图像处理机器学习真实项目教程(python实现)1计算机视觉简介
    1计算机视觉简介欢迎来到计算机视觉的世界。本书将带您踏上令人兴奋且快速发展的计算机视觉和图像处理世界的旅程。本书首先介绍计算机视觉和OpenCV库。然后,我们将继续介绍本课程的基本库和所需的环境设置。主要内容:计算机视觉简介计算机视觉的应用PythonOpenCVOpenCV......
  • Python计算两图相似性-直方图
    1、简介利用直方图计算图片的相似度时,是按照颜色的全局分布情况来看待的,无法对局部的色彩进行分析,同一张图片如果转化成为灰度图时,在计算其直方图时差距就更大了。对于灰度图可以将图片进行等分,然后在计算图片的相似度。 2、代码fromPILimportImage#将图片转化为RG......
  • ELK + Python 实现警报
    关于ELK索引特定字段报警的特殊方式:ELK+python脚本。FILEBEAT(日志采集)-->logstash(日志过滤)-->es(日志分类索引)-->kibana(展示)邮件系统的日志比较复杂,包含众多的日志,比如用户登录日志、用户下载附件日志、垃圾邮件垃圾日志等采集大量的数据如何区分那些是有用的信息,比......
  • 深入解析 Python 中的对象创建与初始化:__new__ 与 __init__ 方法
    Python中的面向对象编程涉及许多特殊方法,其中__new__和__init__是两个关键的方法。它们分别负责对象的创建和对象的初始化,在对象的生命周期中扮演着不同而又互补的角色。让我们深入探讨这两个方法,了解它们的作用、区别以及如何在实际开发中应用。1. __new__方法当谈到Pyth......
  • 使用XPath进行网页爬取的Python实现
    XPath是一种用于在XML和HTML文档中进行导航和查询的语言。在网页爬取中,XPath可以帮助我们定位和提取特定的网页元素,从而实现数据的抓取和提取。本文将介绍如何使用Python中的XPath库来进行网页爬取。1.安装依赖库:在使用XPath进行网页爬取之前,我们需要安装相关的依赖库。Python中常......
  • Python中使用del删除列表元素的原理解析
    Python是一种功能强大的编程语言,提供了许多方便的操作列表的方法。其中,使用del关键字可以删除列表中的某个元素。本文将解析Python中使用del删除列表元素的原理,帮助您理解其工作原理和使用方法。1.列表是可变对象:在Python中,列表是一种可变对象,即可以在原地修改的对象。与不可变对象......