热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python解析C语言结构体

本文介绍了使用Python解析C语言结构体的方法,包括定义基本类型和结构体类型的字典,并提供了一个示例代码,展示了如何解析C语言结构体。
# _*_ coding: utf-8 _*_

import re

struct_str = """
struct RNCAP
{
    UINT16 usTest1;
    UINT32 ulTest2;
};
typedef struct
{
	UINT16 usTest1;
	UINT32 ulTest2;
	UINT32 ulTest3;
	RNCAP rncapStru;
	UINT16 usTest6;
	UINT8  ucTest7;
	UINT16 usTest8;
} RNCAP_POOL;
"""

stream = "ABCDEF012345678912345"

#basic_tpye_list = ["UINT8", "UINT16", "UINT32", "UINT64"]
basic_type_dict = {"UINT8":1, "UINT16":2, "UINT32":4, "UINT64":8}
struct_type_dict = {}

class BasicType(object):
    def __init__(self):
        self.type = ""
        self.struct_name = ""
        self.var_name = ""
        self.position = 0
        self.size = 0
        self.value = 0
        self.sub_basic_type_list = []

def struct_2_basic_type(stream_str):

    if "struct" not in stream_str or         ";" not in stream_str or         "{" not in stream_str or         "}" not in stream_str:
        print("struct format error!")
        return

    stream_lines = stream_str.splitlines()
    type_is_typedef = False
    type_position = 0
    type_size = 0

    for line in stream_lines:
        if "struct" in line:
            basic_type = BasicType()
            basic_type.position = 0
            type_position = 0
            type_size = 0
            type_is_typedef = False
            if "typedef" not in line:
                variables = line.split(" ", 1)
                basic_type.struct_name = variables[1].strip()
            else:
                type_is_typedef = True
            continue

        if "}" in line and ";" in line:
            if type_is_typedef:
                m = re.search("[A-Za-z0-9_]+", line)
                if m is not None:
                    basic_type.struct_name = m.group()
            basic_type.size = type_size
            basic_type_dict[basic_type.struct_name] = basic_type.size
            struct_type_dict[basic_type.struct_name] = basic_type
            continue

        m = re.search("[A-Za-z0-9_]+[ ]+[A-Za-z0-9_]+;", line)
        if m is None:
            continue
        variables = m.group()[:-1].split(" ", 1)
        sub_basic_type = BasicType()
        sub_basic_type.struct_name = variables[0].strip()
        sub_basic_type.var_name = variables[1].strip()
        sub_basic_type.position = type_position
        sub_size = basic_type_dict.get(sub_basic_type.struct_name)
        if sub_size is None:
            continue
        sub_basic_type.size = sub_size
        type_position += sub_size
        type_size += sub_size
        struct_type = struct_type_dict.get(sub_basic_type.struct_name)
        if struct_type is not None:
            sub_basic_type.sub_basic_type_list = struct_type.sub_basic_type_list
        basic_type.sub_basic_type_list.append(sub_basic_type)

    return basic_type

def stream_2_struct(struct_info, stream_str):
    if struct_info.size != len(stream_str):
        print("struct size and len stream are not equal.")
        return

    for sub_struct in struct_info.sub_basic_type_list:
        if len(sub_struct.sub_basic_type_list) == 0:
            sub_struct.value = int(stream_str[sub_struct.position:sub_struct.position+sub_struct.size], 16)
        else:
            stream_2_struct(sub_struct, stream_str[sub_struct.position:sub_struct.position+sub_struct.size])


if __name__ == "__main__":

    basic_type = struct_2_basic_type(struct_str)

    stream_2_struct(basic_type, stream)

    print basic_type.struct_name

    pass

python解析C语言结果


推荐阅读
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 本文详细介绍了C++中的构造函数,包括其定义、特点以及如何通过构造函数进行对象的初始化。此外,还探讨了转换构造函数的概念及其在不同情境下的应用,以及如何避免不必要的隐式类型转换。 ... [详细]
  • 数据类型--char一、char1.1char占用2个字节char取值范围:【0~65535】char采用unicode编码方式char类型的字面量用单引号括起来char可以存储一 ... [详细]
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 在日常生活中,支付宝已成为不可或缺的支付工具之一。本文将详细介绍如何通过支付宝实现免费提现,帮助用户更好地管理个人财务,避免不必要的手续费支出。 ... [详细]
  • publicclassBindActionextendsActionSupport{privateStringproString;privateStringcitString; ... [详细]
  • Requests库的基本使用方法
    本文介绍了Python中Requests库的基础用法,包括如何安装、GET和POST请求的实现、如何处理Cookies和Headers,以及如何解析JSON响应。相比urllib库,Requests库提供了更为简洁高效的接口来处理HTTP请求。 ... [详细]
  • 本文详细介绍了iOS应用的生命周期,包括各个状态及其转换过程中的关键方法调用。 ... [详细]
  • 在OpenCV 3.1.0中实现SIFT与SURF特征检测
    本文介绍如何在OpenCV 3.1.0版本中通过Python 2.7环境使用SIFT和SURF算法进行图像特征点检测。由于这些高级功能在OpenCV 3.0.0及更高版本中被移至额外的contrib模块,因此需要特别处理才能正常使用。 ... [详细]
author-avatar
抑制不L挑逗烛
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有