我有一个很长的比特流,并且有一个指向它开头的void指针。从这个比特流,我想从位位置'm'中提取'n'位。
例如,我想从第57位位置提取75位。怎么做?
我尝试通过将void指针强制转换为char指针然后将其递增到m / 8来实现。从现在开始,我不知道如何从这里开始提取。
如何在C中使用这些比特流?
请原谅我,因为我没有在这里写任何关于方法的代码,因为我不知道如何继续进行,没有比这里更好的解决方法。
答案 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);
}