解析二进制文件所需的帮助

时间:2011-06-18 18:23:36

标签: c++ visual-studio-2010 vector binary binaryfiles

我正在尝试通过编写C ++应用程序与开源程序进行交互,这些应用程序可以读取 - 修改 - 写入该程序使用的二进制文件格式。好处是程序是开源的,坏的是它的二进制文件不遵循任何“标准”,只是它自己的阅读和保存方式。

这就是程序在文件中保存bool变量的方式:

memset(keyword, 0, 100);
sprintf(keyword, "drawbox");
fout.write((char*)keyword, strlen(keyword)+1);
fout.write((char*)&m_drawBox, sizeof(bool));

这就是它如何阅读bool

else if (strcmp(keyword, "drawbox") == 0)
fin.read((char*)&m_drawBox, sizeof(bool));

这部分工作正常,我可以解析它。我也可以像整数一样解析单个变量。

我的问题在于它保存向量或四元数时的部分。

保存向量position

memset(keyword, 0, 100);
sprintf(keyword, "position");
fout.write((char*)keyword, strlen(keyword)+1);
fout.write((char*)&m_position, 3*sizeof(float));

阅读向量position

fin.read((char*)&m_volMax, 3*sizeof(float));
else if (strcmp(keyword, "position") == 0)

所以这些都是原始源代码的片段。在我的代码中,如果我尝试使用以下内容,我就会遇到问题。

以下是我的代码中的部分:

struct Vec
{
    float x,y,z;
};

Vec m_position;

else if (strcmp(keyword, "position") == 0)
    fin.read((char*) &kf.m_position, 3*sizeof(float));

但这不起作用。以下是我从示例文件中获取的值:

m_position x = -1.07374e+008
m_position y = -1.07374e+008
m_position z = -1.07374e+008

所以不知何故,这些值不会被分成x,y,z,它们会被重复到相同的x,y,z部分!

有人可以帮我解决导致此问题的原因吗?实际上这种保存文件的方式是什么?使用(* char)?

将内存直接写入文件是不是一个奇怪的想法

这是与原始文件中的3 *浮点向量m_position对应的二进制数据。

45 01 67 44 9E 57 19 C3 48 14 09 45

2 个答案:

答案 0 :(得分:6)

  

m_position x = -1.07374e + 008

如果你看看调试器的原始内存视图的值,你会看到float的字节值是0xcccccccc。这是一个特殊值,MSVC编译器使用它来初始化Debug构建中的变量。

换句话说,你的m_position变量从未被分配过。

缺少更多信息,至少有一个简单的解释:fin.read()调用没有读取任何内容。我必须假设你的代码不包含任何错误检查,这是一个常见的遗漏。

答案 1 :(得分:0)

Actualy几个星期前我做了二进制文件解析,得到了一个与你的结果相同的丑陋bug。问题是,当我将二进制数据写入文件时,我忘了关闭文件。因此,读取数据并将其解析回ascii我得到了与您相同的结果。

  • Hans Passant说fin.read()没有读任何东西。所以....

我不是说你的情况就是这样,但检查没有伤害,是吗?