У меня есть специальный беззнаковый long (32 бита), и мне нужно преобразовать его порядок байтов по битам - мой long представляет несколько вещей, соединенных вместе в один кусок двоичного кода.
Как мне это сделать?
У меня есть специальный беззнаковый long (32 бита), и мне нужно преобразовать его порядок байтов по битам - мой long представляет несколько вещей, соединенных вместе в один кусок двоичного кода.
Как мне это сделать?
Порядок байтов - это концепция на уровне слов, при которой байты либо сохраняются вначале старшего байта (обратный порядок байтов), либо первым младшим байтом (обратный порядок байтов). Данные, передаваемые по сети, обычно имеют обратный порядок байтов (так называемый сетевой порядок байтов). Данные, хранящиеся в памяти на машине, могут быть в любом порядке, причем наиболее распространенным является прямой порядок байтов, учитывая преобладание архитектуры Intel x86. Несмотря на то, что большинство компьютерных архитектур имеют прямой порядок байтов, x86 настолько распространен, что вы чаще всего будете видеть в памяти данные с прямым порядком байтов.
Во всяком случае, суть всего в том, что порядок байтов - это очень специфическая концепция, которая применяется только на уровне байтов, а не на уровне битов. Если ntohs()
, ntohl()
, htons()
и htonl()
не делают то, что вы хотите, то вы имеете дело не с порядком байтов как таковым.
Если вам нужно поменять местами отдельные биты вашего unsigned long или сделать что-то еще сложное, пожалуйста, опубликуйте дополнительную информацию о том, что именно вам нужно сделать.
Будьте осторожны, чтобы понять значение слова "порядок следования байтов". Он относится к порядку байтов в данных, а не к битам внутри байта. Вам может потребоваться только использовать такую функцию, как htonl или ntohl, для преобразования вашего d-слова.
Если вы действительно хотите изменить порядок всех битов в типе данных 32b, вы можете написать итеративный алгоритм для маскирования и сдвига каждого бита в соответствующую отраженную позицию.
Функция простого преобразования порядка байтов для длинного значения без знака может выглядеть следующим образом:
typedef union {
unsigned long u32;
unsigned char u8 [ 4 ];
} U32_U8;
unsigned long SwapEndian(unsigned long u)
{
U32_U8 source;
U32_U8 dest;
source.u32 = u;
dest.u8[0] = source.u8[3];
dest.u8[1] = source.u8[2];
dest.u8[2] = source.u8[1];
dest.u8[3] = source.u8[0];
return dest.u32;
}
Чтобы инвертировать битовый порядок целого числа, вы можете сдвинуть биты в одном направлении и сдвинуть биты к месту назначения в противоположном направлении.
htonl
иntohl
, указанные пользователем. - person BobbyShaftoe   schedule 23.10.2009