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

hyp*_*not 0 c++ binary binaryfiles vector visual-studio-2010

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

这就是程序如何bool在文件中保存变量:

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

这是它如何阅读bool:

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

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

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

保存矢量position:

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

阅读矢量position:

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

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

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

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

Vec m_position;

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

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

m_position x = -1.07374e+008
m_position y = -1.07374e+008
m_position z = -1.07374e+008
Run Code Online (Sandbox Code Playgroud)

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

有人可以帮助我造成这种情况吗?实际上这种保存文件的方式是什么?使用(*char)将内存直接写入文件是不是一个奇怪的想法?

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

45 01 67 44 9E 57 19 C3 48 14 09 45
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 6

m_position x = -1.07374e + 008

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

换句话说,您的m_position变量从未被分配.

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