You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

逆向分析工具:如何将3D可视化纹理缓冲区保存为文本文件?

如何将OpenGL纹理缓冲区数据保存为文本文件用于外部分析

完全可行,纹理缓冲区databuf_中的数据就是原始输入文件的字节拷贝,只要正确读取缓冲区内容并格式化输出,就能导出可用于外部分析的文本文件。

你之前的问题分析

  1. 保存data时,代码fprintf(fp, "%d, %x\n", size,getData());仅输出了数据大小和getData()返回的指针地址,并没有写入实际的字节内容,这是导致你没得到有效数据的原因。
  2. 尝试保存databuf_时,直接调用file.write(databuf_)是错误的——databuf_是QOpenGLBuffer对象指针,不是原始数据缓冲区,write方法需要传入实际的字节数据指针。

正确的实现方案

你可以通过映射OpenGL缓冲区内存的方式读取databuf_中的数据,再将其格式化为文本写入文件。以下是修改后的代码示例:

在databuf_->allocate(data, size);之后添加保存逻辑:

// 读取并保存纹理缓冲区数据
databuf_->bind();
// 映射缓冲区为只读模式,获取数据指针
uint8_t* bufferData = static_cast<uint8_t*>(databuf_->map(QOpenGLBuffer::ReadOnly));
if (bufferData) {
    FILE* fp = fopen("/home/isfet/outputs/texture_buffer_data.txt", "w");
    if (fp) {
        for (int i = 0; i < size; ++i) {
            // 以两位十六进制格式输出每个字节,空格分隔
            fprintf(fp, "%02x ", bufferData[i]);
            // 每16个字节换行,提升可读性
            if ((i + 1) % 16 == 0) {
                fprintf(fp, "\n");
            }
        }
        fclose(fp);
    }
    // 取消缓冲区映射
    databuf_->unmap();
}
databuf_->release();

可选格式调整

如果需要十进制格式或逗号分隔的数值(方便导入Excel、Python等工具分析),可以修改输出逻辑:

// 十进制格式示例
fprintf(fp, "%d, ", bufferData[i]);
// 或用QTextStream更简洁处理
QFile file("/home/isfet/outputs/texture_buffer_data.txt");
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
    QTextStream out(&file);
    for (int i = 0; i < size; ++i) {
        out << bufferData[i] << ",";
        if ((i + 1) % 16 == 0) out << "\n";
    }
}

注意事项

  • 必须在缓冲区绑定(bind())后才能映射内存,操作完成后务必调用unmap()和release()释放资源。
  • 若处理大文件,直接写入文本可能效率较低,可先保存为二进制文件,再通过脚本批量转换为文本格式。

内容的提问来源于stack exchange,提问作者isf3t

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 06:42:39