2008-11-05 45 views
7

我在char []数组中有一大块二进制数据,我需要将它解释为打包的6位值的数组。将字符数组视为比特流的C/C++代码

可以坐下来写一些代码来做到这一点,但我想,必须有一个良好的现存类或函数有人已经写入。

我需要的是这样的:

int get_bits(char* data, unsigned bitOffset, unsigned numBits); 

,所以我可以通过调用获取数据第七届6位字符:

const unsigned BITSIZE = 6; 
char ch = static_cast<char>(get_bits(data, 7 * BITSIZE, BITSIZE)); 
+0

可能会更快地编写代码。 – mdec 2008-11-05 07:47:27

+0

这不会是FIELDATA,会吗? http://www.fourmilab.ch/documents/univac/fieldata.html – warren 2008-11-05 13:07:14

+0

那么,这是路透社MarketFeed其实 – AndrewR 2008-11-05 22:01:02

回答

4

根据endian系统,这对于大于8的尺寸可能无效。这基本上是马尔科发布的,尽管我不完全确定他为什么一次只能收集一点。

int get_bits(char* data, unsigned int bitOffset, unsigned int numBits) { 
    numBits = pow(2,numBits) - 1; //this will only work up to 32 bits, of course 
    data += bitOffset/8; 
    bitOffset %= 8; 
    return (*((int*)data) >> bitOffset) & numBits; //little endian 
    //return (flip(data[0]) >> bitOffset) & numBits; //big endian 
} 

//flips from big to little or vice versa 
int flip(int x) { 
    char temp, *t = (char*)&x; 
    temp = t[0]; 
    t[0] = t[3]; 
    t[3] = temp; 
    temp = t[1]; 
    t[1] = t[2]; 
    t[2] = temp; 
    return x; 
} 
1

我认为下列行中的某些内容可能有效。

int get_bit(char *data, unsigned bitoffset) // returns the n-th bit 
{ 
    int c = (int)(data[bitoffset >> 3]); // X>>3 is X/8 
    int bitmask = 1 << (bitoffset & 7); // X&7 is X%8 
    return ((c & bitmask)!=0) ? 1 : 0; 
} 

int get_bits(char* data, unsigned bitOffset, unsigned numBits) 
{ 
    int bits = 0; 
    for (int currentbit = bitOffset; currentbit < bitOffset + numBits; currentbit++) 
    { 
     bits = bits << 1; 
     bits = bits | get_bit(data, currentbit); 
    } 
    return bits; 
} 

我没有调试,也没有测试它,但你可以使用它作为一个起点。

另外,考虑位顺序。你可能想

int bitmask = 1 << (bitoffset & 7); // X&7 is X%8 

int bitmask = 1 << (7 - (bitoffset & 7)); // X&7 is X%8 

取决于如何位排列已经产生变化。

相关问题