如何从位位置而不是字节边界 c# 开始的字节数组中提取字节

本文关键字:字节 开始 字节数 数组 提取 边界 位置 | 更新日期: 2023-09-27 18:33:53

我在 c# 中有一个字节数组。我需要从可能不在字节边界上的位位置开始提取一定数量的字节。

如何从位位置而不是字节边界 c# 开始的字节数组中提取字节

编写一个小的辅助方法,该方法使用 shift 运算符来获取一个字节例如

byte[] x = new[] {0x0F, 0xF0}
result = x[0] << 4 | x[1] >> 4;

从第 5 位位置返回 8 位0xFF

您可以使用取模运算符轻松改变位置%

字节

是可以使用 .NET 中的标准流读取器读取的最小对齐方式

如果要读取位,则需要使用按位运算符和掩码来确定位是打开 (1( 还是关闭 (0(。

但是,这意味着您可以使用布尔值 true/false 来判断字节的内容是什么。一种方法是将位读入布尔枚举。像这样的扩展方法可以工作:

public static IEnumerable<bool> BitsToBools(IEnumerable<byte> input)
{
    int readByte;
    while((readByte = input.MoveNext()) >= 0)
    {
        for(int i = 7; i >= 0; i--) // read left to right
            yield return ((readByte >> i) & 1) == 1;
    }
}

如果需要,可以向扩展方法添加 startIndex 和 count,或者从调用方法传入范围。