سؤال

ولدي كتلة كبيرة من البيانات الثنائية في شار [] مجموعة التي أنا بحاجة لتفسير باعتباره مجموعة من القيم معبأة 6-بت.

أنا <م> يمكن الجلوس وكتابة بعض الرموز للقيام بذلك ولكن أنا أفكر يجب أن يكون هناك فئة موجودة جيدة أو وظيفة شخص ما قد كتب بالفعل.

ما احتاج اليه هو شيء مثل:

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

وحتى أتمكن من الحصول على 7TH الطابع 6 بت في البيانات عن طريق الاتصال:

const unsigned BITSIZE = 6;
char ch = static_cast<char>(get_bits(data, 7 * BITSIZE, BITSIZE));
هل كانت مفيدة؟

المحلول

وهذا قد لا تعمل لأحجام أكبر من 8، اعتمادا على نظام endian. انها في الاساس ما نشر ماركو، على الرغم من أنني لست متأكدا تماما لماذا عنيدا وجمع بت واحد في وقت واحد.

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

نصائح أخرى

Boost.DynamicBitset - محاولة ذلك.

وأعتقد أن هناك شيئا في خط التالية قد تعمل.

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

واعتمادا على كيفية تم إنشاء مجموعة الشيء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top