【问题标题】:Extracting specific bits from a bitstream, given a void pointer to the starting of the bitstream从比特流中提取特定比特,给定一个指向比特流开始的空指针
【发布时间】:2017-03-16 14:48:10
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 欢迎来到堆栈溢出!它不是一个代码编写服务,你应该告诉你到目前为止你做了什么,你面临的问题和样本数据。 stackoverflow.com/help/how-to-ask
  • 这是一个关于通过 char 指针访问特定位的问题。它没有回答你的问题,但它可能会让你知道如何进行。 stackoverflow.com/questions/7607224/…

标签: c bitmap bit


【解决方案1】:

这是一个简单且未优化的解决方案,用于从字节数组中提取从 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    相关资源
    最近更新 更多