c - 从比特流中提取特定位,给定一个指向比特流开头的空指针

标签 c bitmap bit

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

例如,我想从第57位位置提取75位。如何做到这一点?

我尝试通过将 void 指针类型转换为 char 指针,然后将其递增到 m/8 来做到这一点。从这里开始,我就不知道如何从这里提取了。

如何在 C 中处理此类比特流?

请原谅我,因为我没有在这里编写任何有关方法的代码,因为我不知道如何继续,而且没有比这里更好的地方来解决这个问题。

最佳答案

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

当请求的 bitIndex 指向 bitArray[] 之外时,getBit() 返回 (-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);
}

关于c - 从比特流中提取特定位,给定一个指向比特流开头的空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40394369/

相关文章:

math - 有没有人试图打破更小一点?

c - 如何在 C 编程中使用 SHA1 散列

c++ - 是否可以在不使用 ‘undef’ 的情况下重新定义宏?

c# - 如何创建位图深拷贝

delphi - 我可以访问 TBits 内部位图吗?

mysql - 加快依赖于 BIT 列的 MySql DELETE

c - c语言声明时按索引赋值数组

C 兴趣嵌套循环

java - 用图库选择的图像比用相机拍摄的图像大得多

Android 将文本转换为位图(包括字体、颜色和大小)的最佳方法是什么?