首页 > 编程语言 >python之struct模块处理二进制

python之struct模块处理二进制

时间:2023-06-01 12:23:17浏览次数:44  
标签:struct python fmt unsigned 二进制 integer binListData

嵌入式开发中,有时需要对二进制流文件进行读写操作,一种方法是将二进制流文件转换为c语言数组形式。

这样可以使用python的struct模块,python的struct模块可以方便的进行字节与二进制之间的相互转换。

1 struct模块常用的几个函数

函数 说明
struct.pack(format, v1, v2, ...) 按照给定的格式(fmt),把数据封装成字符串流(包括2进制流)
struct.unpack(format, buffer) 按照给定的格式(fmt)解析字节流,返回解析出来的元组tuple
struct.unpack_from(format, buffer, offset=0) 该函数可以将缓冲区buffer中的内容在按照指定的格式fmt,从偏移量为offset=numb的位置开始进行读取,返回的是一个对应的元组tuple
struct.calcsize(format) 计算给定的格式(fmt)占用多少字节的内存

重要的是清楚格式(fmt)表达的含义,格式包含两个部分:

  1. 数据格式
  2. 数据字节序(大端or小端?)、对齐方式等。

数据格式如下:

Format C Type Python 字节数
x pad byte no value 1
c char string of length 1 1
b signed char integer 1
B unsigned char integer 1
? _Bool bool 1
h short integer 2
H unsigned short integer 2
i int integer 4
I unsigned int integer 4
l long integer 4
L unsigned long integer 4
q long long integer 8
Q unsigned long long integer 8
n ssize_t integer
N size_t integer
e float 2
f float float 4
d double float 8
s char[] string 1
p char[] string 1
P void * integer

字节序、对齐方式如下:

使用特殊字符来控制。

Character Byte order Size and alignment
@ native native 凑够4个字节,等于c语言中的sizeof
= native standard 按原字节数
< little-endian standard 按原字节数
> big-endian standard 按原字节数
! network (= big-endian) standard 按原字节数

细节可以查看官网,这里只展示一个例子。

3 将二进制数据转换成16进制数组

这里提供一个示例,来演示struct的使用。下面代码将二进制数据转换成16进制数组(代码参考2,有修改)。

# bin2hex.py
"""
将二进制数据的bin文件转换成C语言数组的形式并保存为 .c 源文件
"""
import sys, os
import struct

def bin2hex():
    if len(sys.argv) != 2:
        print("Usage: %s <bin_file>" % (sys.argv[0]))
        return

    filename = sys.argv[1]
    # 读取二进制文件存放到list列表中
    bindata = open(filename, 'rb').read()
    offset = 0
    fmt = '>B'
    binListData = []
    while offset < len(bindata):
        unpackdata = struct.unpack_from(fmt, bindata, offset)
        binListData.append("0x%.2x" % unpackdata[0])
        offset += struct.calcsize(fmt)

    ## 将列表中的数据写入到 .c 源文件中
    fileoutname = os.path.splitext(filename)[0] + '_arry.c'
    print("write to C array file %s" % fileoutname)
    with open(fileoutname, 'w') as fileOutput:
        fileOutput.write("unsigned long hexDataLength = {};\n".format(len(binListData)))
        fileOutput.write("unsigned char hexData[] = {\n")
        for i in range(len(binListData) - 1):
            if (i != 0) and (i % 16 == 0):
                fileOutput.write("\n")
            fileOutput.write(binListData[i] + ",")
        fileOutput.write(binListData[len(binListData) - 1] + "\n};")
    print("bin to C array success!")


if __name__ == '__main__':
    bin2hex()

脚本使用方法:

python3 bin2hex.py <binfile>

生成 binfile_arry.c 16进制数组

参考:

  1. Python使用struct处理二进制
  2. python将二进制数据的bin文件转换成16进制数组形式的C源文件
  3. struct — Interpret bytes as packed binary data — Python 3.11.3 documentation

标签:struct,python,fmt,unsigned,二进制,integer,binListData
From: https://www.cnblogs.com/sureZ-learning/p/17448584.html

相关文章

  • python selenium框架解决ip代理框不能自动化登录,解决pyautogui开不了多线程问题
    有时候我们使用python自动化框架的时候,打开一个网页的时候,它会出现出线这一种登录框,我们f12检查不了,用开发者工具强制检查里面没有任何属性.那这时候我们就可以用到python第三方库:pyautoguiPyAutoGUI:是一个Python库,可用于自动化GUI(图形用户界面)程序的任务。它可以让Pytho......
  • Python批量填补遥感影像的无效值NoData
      本文介绍基于Python中ArcPy模块,对大量栅格遥感影像文件批量进行无效值(NoData值)填充的方法。  在处理栅格图像文件时,我们经常会遇到图像中存在有无效值(即NoData值)的情况。如下图所示,这里有一个矢量面要素图层和该矢量图层范围对应的一景栅格图像;可以看到,由于该栅格图像存在......
  • python目录扫描工具——dirsearch使用,可以使用御剑的字典 支持慢速扫描,一般使用-s 60
    使用御剑的字典:pythondirsearch.py-uxxx.com-e*-w/media/dir_dict/ASP.txt,/media/dir_dict/ASPX.txt,/media/dir_dict/DIR.txt,/media/dir_dict/JSP.txt,/media/dir_dict/MDB.txt,/media/dir_dict/PHP.txt 非常好用!!!如下是御剑的字典文件。 进入dirsearch目录,进行扫描在这......
  • json.dumps(),json.loads(),json.dump(),json.load()方法的区别(python)
    1.json.dumps()json.dump()是将字典类型转化成字符串类型。importjsondic={'a':'1111','b':'2222','c':'3333','d':'4444'}st=json.dumps(dic)print("我是字典类型的",dic)print("我是字......
  • Flask-----轻量级的框架,快速的搭建程序(python)
     Flask是一个基于Python开发并且依赖jinja2模板和WerkzeugWSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借......
  • Python装饰器
    Python装饰器是一种语法糖,用于修改函数或类的行为,而无需修改其源代码。装饰器是一个可以接受函数或类作为参数,并返回一个新函数或类的函数。它可以用于添加功能,比如缓存、日志、计时等,或者改变函数或类的行为,比如限制访问、检查参数、实现单例等。装饰器通常定义为一个函数,该函数......
  • python中的logger模块
    logger提供了应用程序可以直接使用的接口handler将(logger创建的)日志记录发送到合适的目的输出filter提供了细度设备来决定输出哪条日志记录formatter决定日志记录的最终输出格式logging模块介绍logger提供了应用程序可以直接使用的接口handler将(logger创建的)日志记录发送......
  • python读取配置文件
    配置文件作为一种可读性很好的格式,非常适用于存储程序中的配置数据。在每个配置文件中,配置数据会被分组(比如“config”和“cmd”)。每个分组在其中指定对应的各个变量值。如下:#定义config分组[config]platformName=AndroidappPackage=com.romweappActivity=com.romwe.Spl......
  • 【Python】redis 模块_Key-Value 数据库
    RedisRedis是一个开源的基于内存也可持久化的Key-Value数据库,采用ANSIC语言编写。它拥有丰富的数据结构,拥有事务功能,保证命令的原子性。由于是内存数据库,读写非常高速,可达10w/s的评率,所以一般应用于数据变化快、实时通讯、缓存等。但内存数据库通常要考虑机器的......
  • Python特点
    1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。2.易于阅读:Python代码定义的更清晰。3.易于维护:Python的成功在于它的源代码是相当容易维护的。4.一个广泛的标准库:Python的最大的优势之一是丰富的库,跨平台的,在UNIX,Windows和Macintosh兼容很好。......