Question

J'ai un gros bloc de données binaires dans un tableau char [] que je dois interpréter comme un tableau de valeurs 6 bits condensées.

Je pourrais s'asseoir et écrire du code pour le faire, mais je pense qu'il doit exister une bonne classe ou fonction existante, ce que quelqu'un a déjà écrit.

Ce dont j'ai besoin, c'est quelque chose comme:

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

afin que je puisse obtenir le 7ème caractère 6 bits dans les données en appelant:

const unsigned BITSIZE = 6;
char ch = static_cast<char>(get_bits(data, 7 * BITSIZE, BITSIZE));
Était-ce utile?

La solution

Cela peut ne pas fonctionner pour des tailles supérieures à 8, selon le système Endian. C’est fondamentalement ce que Marco a posté, bien que je ne sois pas tout à fait pourquoi il rassemblerait un morceau à la fois.

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

Autres conseils

Boost.DynamicBitset - essayez-le.

Je pense que quelque chose dans la ligne de ce qui suit pourrait fonctionner.

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

Je ne l'ai ni débogué ni testé, mais vous pouvez l'utiliser comme point de départ.

Tenez également compte de l'ordre des bits. Vous voudrez peut-être changer

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

à

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

en fonction de la manière dont le tableau de bits a été généré.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top