gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:25:12 28 4
gpt4 key购买 nike

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

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

所以在 .blend header 中有一个 char 确定指针大小,后来用于文件信息 block (或链接网页上的 fileBlock)等,长度为 4 或 8 个字节。据我所知,在 C++ 中,void 指针仅根据其编译目标平台更改大小(64 位为 8 个字节,32 位为 4 个字节)。但是 .blend 文件可以有任何一个,不管我假设的平台是什么。

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

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

最佳答案

回到维基页面的顶部,您会找到文件头结构。 blend 文件的 header 以“BLENDER”开头,后跟文件的指针大小 -

Size of a pointer
All pointers in the file are stored in this format
'_' (underscore) means 4 bytes or 32 bit
'-' (minus) means 8 bytes or 64 bits.

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

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

创建文件的 blender 拷贝决定了文件使用的大小,因此 32 位构建将在文件中保存 32 位指针,而 64 位构建将保存 64 位指针。

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

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

您将在 source/blender/blenloader 中找到 blender 用来读取 blend 文件的代码.

关于c++如何根据我要处理的文件更改void *的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49135187/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com