2008-11-05 6 views
7

У меня есть большой кусок двоичных данных в массиве char [], который мне нужно интерпретировать как массив упакованных 6-битных значений.Код C/C++ для обработки массива символов как битового потока

I может сесть и написать код, чтобы сделать это, но я думаю, что должен быть хороший класс или функция, которую кто-то уже написал.

Что мне нужно что-то вроде:

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

, чтобы я мог получить 7-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

Нет, это Reuters MarketFeed на самом деле – AndrewR 2008-11-05 22:01:02

ответ

4

Это может не работать при размерах, больших 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 

в зависимости от того, как был сгенерирован битовый массив.