【问题标题】:Is it possible to read bit to bit from a binary file with c++?是否可以使用 C++ 从二进制文件中逐位读取?
【发布时间】:2015-08-10 12:01:06
【问题描述】:

我是新来的,所以我会尽量明确我的问题。我试图得到一个直接的答案,但是当我检查其他问题时,它们非常特别,我感到困惑。

我有一个二进制文件,我需要为我的项目读取它。我也有一份规格表,我正在根据这些规格阅读文件。所以我创建了一个 cpp 文件,并编写了一个简单的程序来读取每个元素。我使用 ifstream 和 read() 函数来读取文件。

问题是在规格表上,我知道我需要读取大小为 12 的位串。从细节来看,很明显我应该为每个元素读取 12 位。但我不确定是否可以逐位读取。其余元素以字节为单位读取。而且,如果我每次读取 2 个字节并使用位“掩码”仅获取 12 位,则在此之后读取的其余元素不会正确匹配。所以我的猜测是我真的只需要读取 12 位。

所以我的问题。是否可以从二进制文件中读取 12 位?还是逐位阅读? .我的意思是只有 12 个,没有读取字节然后屏蔽它们。

非常感谢。

【问题讨论】:

  • 你能把实际的规范贴在上面说你需要以 12 位块读取的地方吗?我可以看到它们指定了 12 个字节而不是位。
  • @NathanOliver:一些通信协议的字段位长度不是 8 的倍数。请参阅 IP header
  • @stefaanv 是的,但整个标题仍然是 8 的倍数。
  • @NathanOliver:不过,如果你能在每个字段的字段中阅读,那就太好了,这就是我理解这个问题的方式。
  • 谢谢大家。正如我在答案中看到的那样,我也指出了规格表。我目前只有一份印刷版,但我将直接向创建它的人询问。似乎有些东西不匹配……因为只有 1 个元素需要非字节多值。

标签: c++ file bits


【解决方案1】:

不,这是不可能的。

您应该做的是读取 2 个字节,屏蔽 12 位以获得您想要的结果,同时将其他 4 位存储在某处。现在,当您再次需要 12 位时,只读取 1 个字节并将其与存储的 4 个位组合。

【讨论】:

    【解决方案2】:

    假设小端。

    1. 将文件读取到uint8_t 的数组中,该数组填充为 6 个字节的倍数

    2. 让你的访问功能

      uint16_t get12Bits(uint8_t *ptr, int loc)
      {
          uint64_t temp;// use lower 48 bits
          memcpy(&temp, ptr+(loc&~0x03), 6*uint8_t);//6bytes, 4 elements
          return 0xfff&(temp>>(loc&0x03)*12);
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 2012-07-11
      相关资源
      最近更新 更多