【问题标题】:How to extract bytes from a byte array starting at a bit position not on a byte boundary c#如何从字节数组中提取字节,而不是字节边界上的位位置c#
【发布时间】:2012-05-20 18:32:07
【问题描述】:

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

【问题讨论】:

  • 请展示一些源代码...你试过什么?什么不工作?

标签: c# bit-manipulation


【解决方案1】:

编写一个小辅助方法,它使用移位运算符来取出一个字节 例如

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

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

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

【讨论】:

  • 你不是说x[0] > 4 ?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-02
    • 2019-12-13
    • 2015-04-14
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多