Frage

Ich habe einen großen Klumpen von binären Daten in einem char [] Array, die ich als eine Anordnung von gepackten 6-Bit-Werten interpretieren muß.

I könnte hinsetzen und einige Code schreiben, dies zu tun, aber ich denke, es gibt eine gute noch vorhandene Klasse zu sein hat oder Funktion jemand schon geschrieben hat.

Was ich brauche, ist so etwas wie:

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

, damit ich die siebten 6-Bit-Zeichen in den Daten durch den Aufruf bekommen kann:

const unsigned BITSIZE = 6;
char ch = static_cast<char>(get_bits(data, 7 * BITSIZE, BITSIZE));
War es hilfreich?

Lösung

Dies kann nicht für Größen größer als 8 arbeitet, abhängig von Endian-System. Es ist im Grunde, was Marco geschrieben, obwohl ich bin mir nicht ganz sicher, warum er ein Bit auf einmal sammeln würde.

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

Andere Tipps

Boost.DynamicBitset - versuchen Sie es.

Ich denke, etwas in der Zeile der folgenden funktionieren könnte.

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

Ich habe es nicht ausgetestet noch getestet, aber man kann es als Startpunkt verwenden.

Auch berücksichtigen Bitreihenfolge. Sie könnten ändern möchten

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

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

Je nachdem, wie die Bit-Array erzeugt worden ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top