【问题标题】:Read values from unsigned char bytestream in C++从 C++ 中的 unsigned char 字节流中读取值
【发布时间】: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


【解决方案1】:

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

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

version 就是这个

version = bytes[13] | (bytes[14] << 8) | (bytes[15] << 16) | (bytes[16] << 24);

(版本的偏移量为 13 似乎有点奇怪,我只是按照您上面所说的进行)。

【讨论】:

    猜你喜欢
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 2021-04-03
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多