2008-11-05 13 views
7

Tengo una gran cantidad de datos binarios en una matriz char [] que necesito interpretar como una matriz de valores de 6 bits empaquetados.Código C/C++ para tratar una matriz de caracteres como un tren de bits

I podría sentarse y escribir un código para hacer esto, pero estoy pensando que tiene que haber una buena clase o función existente que alguien ya haya escrito.

Lo que necesito es algo así como:

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

así que podría conseguir el séptimo carácter de 6 bits en los datos llamando:

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

Probablemente sea más rápido escribir el código. – mdec

+0

esto no sería FIELDATA, ¿o sí? http://www.fourmilab.ch/documents/univac/fieldata.html – warren

+0

Nah, es Reuters MarketFeed en realidad – AndrewR

Respuesta

4

Esto puede no funcionar para tamaños superiores a 8, según el sistema endian. Básicamente, es lo que publicó Marco, aunque no estoy del todo seguro de por qué reunió un poco a la vez.

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; 
} 
+0

Esto hizo el truco. Gracias. – AndrewR

+0

¿cuál es el truco para más de 32 bits (por ejemplo, "larga duración")? ¿cómo sería el código para almacenar los valores en una matriz de caracteres? – Will

7

Boost.DynamicBitset - probarlo.

+0

Sí, lo consideré pero estaba esperando algo que empacaría los bits en una int cuando los sacara – AndrewR

1

Creo que algo en la línea de lo siguiente podría funcionar.

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; 
} 

No lo he depurado ni probado, pero puede usarlo como punto de partida.

Además, tenga en cuenta el orden de los bits. Es posible que desee cambiar

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

a

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

dependiendo de cómo se ha generado la matriz de bits.

Cuestiones relacionadas