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

C# 如何从字节数组中提取字节,从位位置开始,而不是从字节边界开始#,c#,bit-manipulation,C#,Bit Manipulation,我在c#中有一个字节数组。我需要从不在字节边界上的位位置开始提取一定数量的字节。编写一个使用移位运算符提取字节的小助手方法 e、 g byte[]x=new[]{0x0F,0xF0} 结果=x[0]>4; 从第5位位置返回8位0xFF 您可以使用模运算符%轻松改变位置。一个字节是您可以使用.NET中的标准流读取器读取的最小对齐方式 如果要读取位,则需要使用位运算符和掩码来确定位是开(1)还是关(0) 但是,这意味着您可以使用布尔真/假来判断字节的内容。一种方法是将位读入布尔枚举。类似这样的扩展

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

编写一个使用移位运算符提取字节的小助手方法 e、 g

byte[]x=new[]{0x0F,0xF0}
结果=x[0]>4;
从第5位位置返回8位
0xFF


您可以使用模运算符
%

轻松改变位置。一个字节是您可以使用.NET中的标准流读取器读取的最小对齐方式

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

但是,这意味着您可以使用布尔真/假来判断字节的内容。一种方法是将位读入布尔枚举。类似这样的扩展方法可能会起作用:

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;
    }
}
公共静态IEnumerable位bools(IEnumerable输入)
{
int读取字节;
而((readByte=input.MoveNext())>=0)
{
对于(int i=7;i>=0;i--)//从左到右读取
收益率回报率((readByte>>i)&1)==1;
}
}

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

请显示一些源代码。。。你试过什么?什么不起作用?你不是说x[0]>4吗?
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;
    }
}