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

时间:2012-05-12 12:09:49

标签: c# bit-manipulation

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

2 个答案:

答案 0 :(得分:1)

编写一个小帮助方法,它使用移位运算符来获取一个字节 e.g。

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

从第5位位置0xFF

返回8位

您可以使用模运算符%

轻松改变位置

答案 1 :(得分:0)

一个字节是您可以使用.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,或者从调用方法传入范围。