从比特流中提取特定位,给出指向比特流开始的空指针

时间:2016-11-03 05:23:13

标签: c bitmap bit

我有一个很长的比特流,并且有一个指向它开头的void指针。从这个比特流,我想从位位置'm'中提取'n'位。

例如,我想从第57位位置提取75位。怎么做?

我尝试通过将void指针强制转换为char指针然后将其递增到m / 8来实现。从现在开始,我不知道如何从这里开始提取。

如何在C中使用这些比特流?

请原谅我,因为我没有在这里写任何关于方法的代码,因为我不知道如何继续进行,没有比这里更好的解决方法。

1 个答案:

答案 0 :(得分:0)

这是一个简单且非优化的解决方案,用于从EXTRACT_COUNT(此处= 57)开始从EXTRACT_OFFSET位(此处= 75)中提取字节数组。

当请求的getBit()指出bitIndex时,bitArray[]返回(-1),否则返回提取位的值。

#include <stdio.h>

int getBit(unsigned char bitArray[], int lenArray,int bitIndex)
{
    int iBytePos = bitIndex >> 3;
    int iByteBit = bitIndex % 8;
    unsigned char uByteVal;

    if (iBytePos > lenArray) {
        return (-1);
    }
    uByteVal = bitArray[ iBytePos ];
    if (iByteBit==0) printf("."); // to mark the 8bits border
    if ((uByteVal & (0x80 >> iByteBit)) != 0) {
        return (1);
    }
    return (0);
}

#define ARRAY_SIZE (18)
#define EXTRACT_OFFSET (57)
#define EXTRACT_COUNT  (75)

int main()
{
    unsigned char tabByte[ARRAY_SIZE] = {
        0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xFF,
        0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x00 };

    int iVal,iCount;

    iCount=0;
    for(int i=0;i<EXTRACT_COUNT;i++)
    {
        iVal = getBit(tabByte,ARRAY_SIZE,i+EXTRACT_OFFSET);
        if (iVal >= 0) {
            iCount++;
            printf("%1d",iVal);
        }
    }
    printf("\niCount=%d\n",iCount);
    return (0);
}