Как преобразовать порядок байтов в массив битов

Я хочу преобразовать значение из прямого порядка байтов в обратный порядок байтов (и наоборот). У меня значение выражено как массив бит, а не как одно целое число. Как я могу реализовать функцию замены байтов?


person Puppy    schedule 05.06.2012    source источник
comment
Не std::reverse сработает, или мне не хватает чего-то огромного?   -  person chris    schedule 05.06.2012
comment
@chris: Порядок байтов определяет, какой является самый старший байт байт.   -  person tskuzzy    schedule 05.06.2012
comment
@chris: Я думаю, что это изменило бы всю последовательность и только порядок байтов ... поменять местами какие-то байты или что-то в этом роде?   -  person Puppy    schedule 05.06.2012
comment
@tskuzzy, Дерьмо, я оцепенел от того, что сейчас июнь ›.›   -  person chris    schedule 05.06.2012
comment
@DeadMG, а как насчет std::rotate? Вы можете перемещать группу битов.   -  person chris    schedule 05.06.2012
comment
Под массивом битов вы имеете в виду массивы из 0 и 1, каждый из которых представлен int, или упакованный массив, такой как битовый набор?   -  person tskuzzy    schedule 05.06.2012
comment
@tskuzzy: на самом деле это указатель на выражение, которое позже дает этот бит. Таким образом, вы можете забыть о распаковке массива в фактическое целое число без знака или что-то в этом роде, потому что нет способа определить значения рассматриваемых битов.   -  person Puppy    schedule 05.06.2012
comment
@DeadMG: Итак, наименьшая единица ваших данных - это бит, а не байт, верно?   -  person user541686    schedule 05.06.2012


Ответы (2)


Я не особо разбираюсь в C ++, так что сделаю это в общих чертах.

Преобразование от прямого порядка байтов к прямому порядку байтов означает обратное преобразование байтов. То есть сегмент 8 бит.

Итак, если у вас есть массив из N байтов (здесь псевдокодирован):

bool bits[8*N];

Вы сделаете что-то вроде этого:

for(int i = 0; i < N/2; i++) {
    for(int j = 0; j < 8; j++) {
        bool tmp = bits[8*i+j];
        bits[8*i+j] = bits[8*(N-i-1)+j];
        bits[8*(N-i-1)+j] = tmp;
    }
}

В комментариях вы упомянули, что «биты» на самом деле являются указателями на выражения, которые позже оцениваются на правильные биты. Правильное изменение порядка указателей таким образом приведет к правильному изменению порядка байтов, когда вы позже получите биты.

person tskuzzy    schedule 05.06.2012

Вы можете проверить этот отличный статья, где все объясняется, как менять местами данные и обрабатывать их с разным порядком байтов. Также, возможно, вам будет полезен набор функций endian.h.

person Santiago    schedule 24.09.2012