【发布时间】:2020-05-14 18:13:45
【问题描述】:
我的任务是从 unsigned char 数组中读取元数据值,该数组包含二进制 .shp 文件(Shapefile)的字节
unsigned char* bytes;
存储在数组中的文件的标题和存储在其中的信息的顺序如下所示:
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 Bytes (5 * int32)。然后读取四个字节,确保大端字节序,并将其存储在 int32_t 中。然后读取四个字节,确保小端字节序,并再次将其存储在 int32_t 中,依此类推。
感谢你们的帮助!
【问题讨论】:
-
从标准 C++ 文件中读取使用
ifstream,而对于二进制读取使用istream::read。你尝试了什么,它是如何失败的? -
但是我不明白你为什么在一句话中说输入是一个无符号字符数组,而下一句是二进制文件。是哪个?
-
int32_t是四个字节。要从字节流构造int32_t值,您需要从流中“读取”(提取)四个字节。并将它们组合起来(使用按位移位和或操作是常见的方法)。字节序问题更难解决,除非您确切知道流中字节的字节序。 -
你尝试了什么?
-
@john 我目前正在为 Rust 项目编写 WASM 插件。所以是的,我正在读取一个 .shp 文件,但是对于插件,我将文件的字节作为 unsigned char 数组。因此,对于我的任务,我必须从一个 unsigned char 数组中读取,其中存储了文件的字节。
标签: c++ metadata filereader endianness bytestream