如何从字节数组中提取几个位或字节?

How to extract few bits or bytes from a byte array?

我想要一个函数来帮助我从字节数组的起始位位置提取一些位或字节。字节数组的顺序是LSB。代码骨架如下:

typedef unsigned char uint8;
typedef unsigned short uint16;
uint16 ExtractBitsOrBytes(uint16 StartBit, uint8 *ByteArray, uint16 BitsWanted)
{
    uint16 Result;
    ...
}

如何在 C 中实现此逻辑?。非常感谢任何示例或起点。

您的问题没有完全说明:LSB 指的是跨越一个字节以上的整数类型在内存中的字节顺序。在您的情况下,您必须指定位在数组中的编号方式以及如何组合以形成提取的值。

从 0 开始对位进行编号是有意义的,这样位 n 就是偏移量 n / 8 处字节中值为 1 << (n % 8) 的位。为了保持一致性,编号最小的位应成为提取值的最低有效位。此约定与 LSB 一致,因为在偏移量 0 处提取 16 位会产生存储在数组前 2 个字节中的 uint16 的值。

下面是使用此约定的简单实现:

typedef unsigned char uint8;
typedef unsigned short uint16;

uint16 ExtractBitsOrBytes(uint16 StartBit, const uint8 *ByteArray, uint16 BitsWanted) {
    // assuming BitsWanted <= 16
    uint16 result = 0;
    uint16 i;
    for (i = 0; i < BitsWanted; i++) {
        result |= (uint16)((ByteArray[StartBit >> 3] >> (StartBit & 7)) & 1) << i;
        StartBit++;
    }
    return result;
}

但是请注意,在许多系统上用于单色位图的约定是不同的:最左边的像素对应于第一个字节的最高有效位,该约定继承自 70 年代后期的选择,混合了 MSB 和 LSB,这使得图形软件比它应该的更复杂。