gpt4 book ai didi

c# - 如何读取文件中的每 7 位作为整数?

转载 作者:太空宇宙 更新时间:2023-11-03 17:50:38 25 4
gpt4 key购买 nike

我有一些文件,其中每 7 位代表一个小端整数。

到目前为止,我有一个实现将字节读入字节数组,转换为字符串,使用循环索引将 7 个字符放入 BitArray,并根据它的索引执行 2^x,但这看起来非常慢(文件只有 20KB,但需要 5 分钟以上的时间来解析),而且转换太多,不是最好的方法。

有没有办法直接从文件中读取一组 7 位?

最佳答案

如果这些 7 位整数没有打包,那么处理每个字节的最低有效 7 位就是一件简单的事情:

Byte b; Int32 nb;
while( (nb = reader.ReadByte()) != -1 ) {
b = (Byte)nb;

Byte value = b & 0x7F;
yield return value;
}

如果这些是打包字节,那就更有趣了:)

您需要使用 1 到 2 个字节来提取值。我假设输入是一个 Byte 流(为了简化 API,使用 IEnumerator 表示),其中 7 位的打包方式如下:

7-bit  |0                                 |1                                 |2                                 |3                                 |4
Bytes |0 |1 |2 |3
Bits |0 |1 |2 |3 |4 |5 |6 |7 |0 |1 |2 |3 |4 |5 |6 |7 |0 |1 |2 |3 |4 |5 |6 |7 |0

算法是这样的:

  1. 维护一个“位索引”(bi),它告诉我们下一个 7 位整数开始的位偏移量是多少(在每个字节中)。
  2. 读取一个字节(b0),取出前 7 位并 yield-return。
  3. 将 bit-index 增加 7。
  4. 7 + 7 大于 8(一个字节的大小)所以我们需要另一个字节。读取另一个字节并将其 (b1) 与前一个字节 (b0) 组合成一个可以一次性读取的 16 位值
  5. 通过从中读取位 (bi + 7) 提取下一个 7 位值,将其移位以使其有用,然后将其返回。
  6. 重复。

这里可能有一些错误,如果您发现任何错误,请告诉我!

public static IEnumerable<Byte> ReadPacked7BitInts(IEnumerator<Byte> inputBytes) {

Int32 bi = 0; // bit-index

if( !inputBytes.MoveNext() ) yield break;
Byte b0 = inputBytes.Current;

while( true ) {
if( bi == 0 ) yield return b0 & 0x7F;
if( bi == 1 ) yield return (b0 >> 1) & 0x7F;
else {
// Read another byte
if( !inputBytes.MoveNext() ) yield break;
Byte b1 = inputBytes.Current;
UInt16 value = (UInt16)b0 | ((UInt16)b1 << 8);

yield return ( value >> bi ) & 0x7F;
}

bi = (bi + 7) % 8;
}
}

关于c# - 如何读取文件中的每 7 位作为整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28821260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com