C++ 从C++;

C++ 从C++;,c++,metadata,filereader,endianness,bytestream,C++,Metadata,Filereader,Endianness,Bytestream,我的任务是从无符号字符数组中读取元数据值,该数组包含binary.shp文件(Shapefile)的字节 存储在数组中的文件头及其存储的信息顺序如下所示: int32_t filecode // BigEndian int32_t skip[5] // Uninteresting stuff int32_t filelength // BigEndian int32_t version // LitteEndian int32_t shapetype // LitteEndian // Rest

我的任务是从无符号字符数组中读取元数据值,该数组包含binary.shp文件(Shapefile)的字节

存储在数组中的文件头及其存储的信息顺序如下所示:

int32_t filecode // BigEndian
int32_t skip[5] // Uninteresting stuff
int32_t filelength // BigEndian
int32_t version // LitteEndian
int32_t shapetype // LitteEndian
// Rest of the header and of the filecontent which I don't need
所以我的问题是,在考虑到端点的情况下,如何提取这些信息(当然跳过部分除外),并将其读入相应的变量中

我考虑过使用ifstream,但我不知道如何正确地使用它

例如:

读取二进制文件的前四个字节,确保大端字节顺序,并将其存储在int32\t中。然后跳过5*4字节(5*int32)。然后读取四个字节,确保大端字节顺序,并将其存储在int32\t中。然后读取四个字节,确保小尾端字节顺序,然后再次将其存储在int32\t中,以此类推


谢谢你们的帮助,伙计们

所以“读取”字节数组只意味着从字节数组中存储数据的位置提取字节。然后,您只需要执行适当的位操作来处理endianess。例如,
filecode
就是这样

filecode = (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3];
version = bytes[13] | (bytes[14] << 8) | (bytes[15] << 16) | (bytes[16] << 24);

(版本13的偏移量有点奇怪,我只是继续上面所说的)。

从标准C++文件中读取使用<代码> IFSturi。二进制读取使用<代码> ISTRAM::读取< /代码>。你尝试了什么,怎么失败了?但我不明白为什么你在一句话中说输入是一个无符号字符数组,而在下一句话中说它是一个二进制文件。它是哪一个?
int32\t
是四个字节。要从字节流构造
int32\t
值,需要从该流“读取”(提取)四个字节。并将它们组合起来(使用按位移位和或运算是常见的方法)。endianness问题更难,除非你确切知道流中字节的endianness。你尝试了什么?@john我目前正在为一个Rust项目编写一个WASM插件。是的,我正在读取一个.shp文件,但是对于插件,我将文件的字节作为无符号字符数组。所以基本上,对于我的任务,我必须从一个无符号字符数组中读取,文件的字节存储在该数组中。
version = bytes[13] | (bytes[14] << 8) | (bytes[15] << 16) | (bytes[16] << 24);