c ++如何根据我要处理的文件更改void *的大小

时间:2018-03-06 16:03:23

标签: c++ file io blender

我目前正在尝试创建一个可以读取.blend文件的程序。好好尝试是重要的部分,因为我已经坚持阅读文件块信息。

Im gonna quickly explain my problem, please refer this page for context

因此在.blend头文件中有一个char,它确定指针大小,后来在文件信息块中使用(或者只是链接网页上的fileBlock),长度为4或8个字节。根据我的阅读,在c ++中,void指针只根据编译的目标平台改变大小(64位为8字节,32位为4字节)。但是.blend文件可以有一个,不管我假设的平台。

现在,由于blender本身也使用c读取自己的文件,因此必须有一种方法可以根据标题中的信息更改指针以匹配所需的指针大小。然而,我最好的猜测是动态地将一个void指针数组分配给一个或两个指针,然后使实际使用的数据更加复杂。

请帮我找到处理不同指针大小的预期方法!

2 个答案:

答案 0 :(得分:1)

是的,这很痛苦。解决方案不是将它们视为C ++。相反,创建自己的class BlendPointer来抽象它。那些将从BlendFile中读取,而BlendFile将存储其BlendPointer在磁盘上是4或8个字节。

答案 1 :(得分:1)

返回到wiki页面的顶部,您将找到File Header结构。混合文件的标题以" BLENDER"开头。其后是文件的指针大小 -

  

指针的大小
  文件中的所有指针都以这种格式存储   ' _' (下划线)表示4个字节或32位
  ' - ' (减号)表示8个字节或64位。

因此,通过读取文件的第八个字节,您就知道文件中指针的大小。

if (file_bytes[7] == "_")
    ptr_size = 4;
else if (file_bytes[7] == "-")
    ptr_size = 8;

创建文件的blender副本确定了文件使用的大小,因此32位构建将在文件中保存32位指针,而64位构建将节省64位指针。

您还应该阅读下一个字节,它会告诉您文件是保存为大端还是小端,以查看是否需要进行任何字节交换。在big endian机器上使用blender可能会变小,但你仍然可能会遇到大端文件。

似乎没有提到的另一个重要的事情是混合文件可以被压缩并且经常被压缩。读取压缩的混合文件意味着使用gzread()来读取文件。压缩文件的前两个字节设置为0x1f 0x8b

您将找到blender用于在source/blender/blenloader中读取混合文件的代码。