C++ c++;如何根据要处理的文件更改void*的大小
我目前正在尝试制作一个可以读取.blend文件的程序。嗯,尝试是重要的一部分,因为我已经被困在阅读文件块信息 因此,在.blend标头中有一个字符,用于确定指针大小是否为4或8字节长,稍后在文件信息块(或仅链接网页上的文件块)中使用。从我所读到的,在C++中,空指针只根据它编译的目标平台(8字节为64位,32位为4字节)改变大小。然而,混合文件可以有任何一个,不管我假设的平台是什么 现在,由于blender本身也使用c读取自己的文件,因此必须有一种方法根据标题中的信息更改指针以匹配所需的指针大小。然而,我的最佳猜测是动态地将一个空指针数组分配给一个或两个指针,这使得实际使用数据变得更加复杂C++ c++;如何根据要处理的文件更改void*的大小,c++,file,io,blender,C++,File,Io,Blender,我目前正在尝试制作一个可以读取.blend文件的程序。嗯,尝试是重要的一部分,因为我已经被困在阅读文件块信息 因此,在.blend标头中有一个字符,用于确定指针大小是否为4或8字节长,稍后在文件信息块(或仅链接网页上的文件块)中使用。从我所读到的,在C++中,空指针只根据它编译的目标平台(8字节为64位,32位为4字节)改变大小。然而,混合文件可以有任何一个,不管我假设的平台是什么 现在,由于blender本身也使用c读取自己的文件,因此必须有一种方法根据标题中的信息更改指针以匹配所需的指针大
请帮助我找到处理不同指针大小的预期方法 是的,那很痛苦。解决方法不是把它们当作C++来对待。相反,您可以创建自己的
类BlendPointer
,将其抽象出来。这些将从BlendFile
读取,并且BlendFile
将存储其BlendPointer
s是磁盘上的4字节还是8字节。返回wiki页面顶部,您将找到文件头结构。混合文件的标题以“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可能会越来越小,但您可能仍然会遇到big-endian文件
另一件似乎没有提到的重要事情是,混合文件可以压缩,而且通常是压缩的。读取压缩的混合文件意味着使用gzread()
读取文件。压缩文件的前两个字节设置为0x1f 0x8b
您将找到blender用于读取混合文件的代码。您不太可能从文件中读取实际指针。您可能正在查看偏移量。只需将它们读入
uint64_t
@FrançoisAndrieux即可:事实上,由于文件不包含键入的数据,因此无法从文件中读取实际指针。显然,blender格式很愚蠢,并且存储实际指针:“旧内存地址:包含上次存储结构时的内存地址。加载文件时,结构可以放在不同的内存地址上。Blender将指向这些结构的指针更新为新的内存地址“作为对象的唯一ID,并将其替换为加载时的地址。因此,该类将只具有一个bool或char或sth来指定其4或8个字节,并将4或8个字节读入通用的void指针中?无效指针是否仍然只有4或8个字节?我应该把它读入一个8字节的int,然后改用它吗?@MoustacheSpy:我应该读入一个std::uint64\u t
。那总是有效的。好的,谢谢。当我成功地实现这一点时,我会把这个答案标记为正确的。我不喜欢一开始就必须创建一个类,因为它会破坏简单地读入struct的简单性,这是由于开销,但是我可以管理