little endian to big endian conversion

Модератор: Модераторы разделов

Аватара пользователя
GRS
Сообщения: 236
Статус: C++ Pro
ОС: Suse10.2/XP

little endian to big endian conversion

Сообщение GRS »

Здравствуйте. Появилась такая проблема. Необходимо преобразовать порядок байтов из little endian в big endian, или наборот.

Вообще проблем с int_16 нет, а вот с int_32 есть.
Вот так я делаю для int_16:

Код: Выделить всё

void reverse(unsigned short & x) {
    x = ((x & 0x00FF00FF) << 8) | ((x & 0XFF00FF00) >> 8);
}


А вот так для int_32:

Код: Выделить всё

void reverse(unsigned & x) {
    x = ((x & 0x0000FFFF) << 16)  | ((x & 0xFFFF0000) >> 16);
}

Во результате в int_32 я получаю перевернутые два байта, т.е из:
0x06 00 00 00 - 0x00 00 06 00
А мне необходимо еще и байты в этих 2-х байтах реверсировать, чтобы получилось вот так: 0x00 00 00 06

Есть идеи, ссылки, пожелания? На мой взгляд будет неплохо использовать реверс int_16 т.е. short, но вот проблема, как разделить int_32 на два int_16? Конечно же бы хотелось оптимизировать этот момент очень хорошо, т.к. операции будут производится много раз.
Спасибо сказали:
Sfunx
Сообщения: 47

Re: little endian to big endian conversion

Сообщение Sfunx »

GRS писал(а):
19.05.2006 08:41
Здравствуйте. Появилась такая проблема. Необходимо преобразовать порядок байтов из little endian в big endian, или наборот.

Вообще проблем с int_16 нет, а вот с int_32 есть.

А вот так для int_32:

Код: Выделить всё

void reverse(unsigned & x) {
    x = ((x & 0x0000FFFF) << 16)  | ((x & 0xFFFF0000) >> 16);
}

Во результате в int_32 я получаю перевернутые два байта, т.е из:
0x06 00 00 00 - 0x00 00 06 00
А мне необходимо еще и байты в этих 2-х байтах реверсировать, чтобы получилось вот так: 0x00 00 00 06

Есть идеи, ссылки, пожелания? На мой взгляд будет неплохо использовать реверс int_16 т.е. short, но вот проблема, как разделить int_32 на два int_16? Конечно же бы хотелось оптимизировать этот момент очень хорошо, т.к. операции будут производится много раз.


Тебе надо поменять порядок байт 1234 на 4321, а ты меняешь 1234 на 3412 :)
Спасибо сказали:
Flagman
Сообщения: 9

Re: little endian to big endian conversion

Сообщение Flagman »

GRS писал(а):
19.05.2006 08:41
Есть идеи, ссылки, пожелания? На мой взгляд будет неплохо использовать реверс int_16 т.е. short, но вот проблема, как разделить int_32 на два int_16? Конечно же бы хотелось оптимизировать этот момент очень хорошо, т.к. операции будут производится много раз.


Не знаю правильно будет так или нет, можно попробовать через union т.е.
union {
int_32 iu_32
int_16 iu_16[2]
char cu[4]
}
Спасибо сказали:
Аватара пользователя
GRS
Сообщения: 236
Статус: C++ Pro
ОС: Suse10.2/XP

Re: little endian to big endian conversion

Сообщение GRS »

Вот так самое оно:

Код: Выделить всё

typedef unsigned short ushort;
typedef unsigned long ulong;
ushort reverse(ushort x) {
    return (x << 8) | (x >> 8);
}
ulong reverse(ulong x) {
    return (reverse((ushort)x) << 16) | reverse((ushort)(x>>16));
}
Спасибо сказали: