【问题标题】:How i can read 9 bits? [duplicate]我如何读取 9 位? [复制]
【发布时间】:2022-01-02 20:05:41
【问题描述】:

我有文件。 我必须从文件中读取每 9 位并将其转换为 int 值。 我知道内存中的最小可寻址单元是 8 位,但我有类似的问题。 我该怎么做?

【问题讨论】:

  • @Charlieface 谢谢,但没有。这个问题没有给出明确的答案。
  • 如果整个文件是这样的,一堆9位的值连续,那么最好将读取整个文件视为一个问题而不是分别考虑每个 9 位数量。通过保留一个“位缓冲区”,您可以从中提取 9 位内容并添加 8 位数据以重新填充它,这样读取此类文件的整体方法可以更简单、更有效。取决于上下文,那么上下文是什么? E:同样对于一个实际的具体答案,将 9 位内容打包在一起的具体方式很重要。
  • 而且“重复”真的很糟糕。即使对于那个问题,答案也很糟糕,对于这个问题更糟。

标签: c# byte bit


【解决方案1】:

读取 2 个字节。获取第一个字节的所有位并将它们存储在一个 int 中(我们称之为firstbyte)。只取第二个字节的第一位(只是 1 或 0;我们称之为extrabit)。这必须附加到第一个字节的末尾(需要左移 1 以腾出空间)。

那么你需要的输出是:

output = (firstbyte << 1) + extrabit;

编辑因为我没有正确阅读问题:边界每 8*9 = 72 位排列一次。在一个循环中,您可以将 9 个字节读入数组 input,并从中创建 8 个 9 位整数(在数组 output 中)。

您基本上是通过将我上面给出的代码推广到任何输入和输出数组来实现的,如下所示:

/* in a loop */
// read 9 bytes into an array called input
// initialize an array output[8]
for (int i = 0; i<8; i++) {
    output[i] = (input[i] << i + 1) + (input[i + 1] && (1 << (i + 1) - 1));
}

请注意,&amp;&amp; ~(1 &lt;&lt; (7 - i) - 1) 是一个位掩码,它选择最重要的 i + 1 位。

【讨论】:

  • 是的,你将如何阅读接下来的 9 位.....?
  • @AndreiMiculiță 非常感谢您的回答,但是如果我需要以这种方式读取文件的所有字节,我该怎么做呢?
  • 读取一个长字节和一个字节(9bytes),那么你就有了 8 条信息。对于前 7 项,您只需要移动 / 屏蔽长边即可将位从左侧和右侧敲掉。对于最后 9 个字节,您将长左移 9 和 |字节
  • (或者只看long是否奇数就知道是否设置字节的第9位(提升为int))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2011-09-14
相关资源
最近更新 更多