Код C/C++ для обработки символьного массива как битового потока

К сожалению, не все запросы ODATA поддерживаются во всех рабочих нагрузках #MicrosoftGraph. Это то, что мы пытаемся стандартизировать. Это расстраивает, я знаю. Первое, что мы делаем в этом квартале, это документирование того, что на самом деле поддерживается, чтобы остановить эту путаницу.

7
задан unwind 5 November 2008 в 07:34
поделиться

3 ответа

Это не может работать на размеры, больше, чем 8, в зависимости от системы порядка байтов. Это в основном, что отправил Marco, хотя я не совсем уверен, почему он собрал бы один бит за один раз.

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;
}
4
ответ дан 6 December 2019 в 21:21
поделиться

Я думаю, что что-то в строке следующего могло бы работать.

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

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

1
ответ дан 6 December 2019 в 21:21
поделиться

Повышение. DynamicBitset - пробуют его.

7
ответ дан 6 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: