学习python调用olefile库解析ole文件的基本用法(续)

根据上一篇文章中对OLE文件的\x01Ole10Native流的结构分析,采用struct库分析流数据。struct库是标准库中处理二进制数据与 Python 基本数据类型转换的核心工具,它模拟了 C 语言结构体的概念,可以将数字、字符串等打包成字节串,也可以从字节串中还原出数据,常用于网络编程、文件格式解析、硬件通信等场景。
  下面的示例代码及运行结果用于从\x01Ole10Native流中提取文件名称、原始数据等信息。

python 复制代码
import olefile
import struct
import os

filename='oleObject1.bin'

def extract_olenative_from_ole(ole_filepath, output_file=None,encoding_type='utf-8'):    
    # 从 OLE 文件中提取 1Ole10Native 流中的嵌入文件
    try:
        with olefile.OleFileIO(ole_filepath) as ole:
            # 检查是否存在 1Ole10Native 流
            if not ole.exists('\x01Ole10Native'):
                print("未找到 1Ole10Native 流")
                return None
            
            # 读取 1Ole10Native 流数据
            stream_data = ole.openstream('\x01Ole10Native').read()
            
            if len(stream_data) < 4:
                print("流数据过短")
                return None
            
            # 解析 OLE10Native 结构
            # 前4字节:嵌入文件大小
            stream_size = struct.unpack('<I', stream_data[:4])[0]
            print(f"stream_size:{stream_size}")            
            
            # 跳过前六个字节
            offset = 6
            
            # 读取文件名(以null结尾的字符串)
            filename_end = stream_data.find(b'\x00', offset)
            if filename_end == -1:
                print("文件名格式错误")
                return None
            
            filename = stream_data[offset:filename_end].decode(encoding_type, errors='ignore')
            print(f"filename:{filename}")
            offset = filename_end + 1
            
            # 读取文件路径(可选,同样以null结尾)
            path_end = stream_data.find(b'\x00', offset)
            if path_end != -1:
                filepath = stream_data[offset:path_end].decode(encoding_type, errors='ignore')
                print(f"filepath:{filepath}")
                offset = path_end + 1                

            # 读取文件路径1(可选,同样以null结尾)
            offset = offset + 4
            data_size = struct.unpack('<I', stream_data[offset:(offset+4)])[0]
            print(f"data_size:{data_size}")
            offset = offset + 4
            filepath1 = stream_data[offset:(offset+data_size)].decode(encoding_type, errors='ignore')
            print(f"filepath1:{filepath1}")
            offset = offset+data_size             
            
            # 提取嵌入文件的原始数据           
            data_size = struct.unpack('<I', stream_data[offset:(offset+4)])[0]
            print(f"data_size:{data_size}")
            offset = offset + 4    
            embedded_data = stream_data[offset:(offset+data_size)]
            
            # 保存到文件
            if output_file:
                with open(output_file, 'wb') as f:
                    f.write(embedded_data)
                print(f"文件已保存到: {output_file}")
            
            return {
                'filename': filename,
                'data': embedded_data
            }
    
    except Exception as e:
        print(f"处理 OLE 文件时出错: {e}")
        return None

# 使用示例
result = extract_olenative_from_ole(
    ole_filepath=filename,
    output_file='111.xml',
    encoding_type='uft-8'
)

# 如果需要进一步处理提取的数据
if result:
    print(f"提取的文件类型: {result['filename'].split('.')[-1] if '.' in result['filename'] else '未知'}")

经过多次验证,如果ole文件中的原始文件名称是中文,采用gbk编码可以正常解码,运行效果如下所示:

参考文献:

1\]https://www.modb.pro/db/585135 \[2\]https://github.com/decalage2/olefile \[3\]https://olefile.readthedocs.io/en/latest/

相关推荐
时71 小时前
Python 项目环境隔离配置指南:pyenv + venv 组合使用
python
岱宗夫up1 小时前
基于OpenCode搭建Skills环境
python·低代码·ai编程
-To be number.wan1 小时前
用 Pandas 分析自行车租赁数据:从时间序列到天气影响的完整实训
python·数据分析·pandas·数据可视化
Coding茶水间2 小时前
基于深度学习的番茄叶子病虫害监测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
图像处理·人工智能·python·深度学习·yolo·目标检测
尘缘浮梦2 小时前
协程asyncio入门案例 1
开发语言·python
没有bug.的程序员2 小时前
Lombok 深度进阶:编译期增强内核、@Data 与 @Builder 逻辑博弈及工业级避坑实战指南
java·开发语言·python·builder·lombok·data·编译器增强
thorn_r2 小时前
RAG系统练手与思考
人工智能·python·机器学习·ai·自然语言处理
IRevers3 小时前
【YOLO】YOLO-Master 腾讯轻量级YOLO架构超越YOLO-13(含检测和分割推理)
图像处理·人工智能·pytorch·python·yolo·transformer·边缘计算
橙露4 小时前
Python 异步爬虫进阶:协程 + 代理池高效爬取实战
开发语言·爬虫·python