Для одного целого числа
Вы можете использовать следующую функцию смены порядкового номера: x
- целое число, для которого вы хотите получить обратный порядковый номер, atomicity
- атомарность порядкового номера, означает числобитов, которые рассматриваются как группа.Обычно это 8.
unsigned int toggle_endian (unsigned int x, int atomicity)
{
unsigned int t = 0;
unsigned int mask, sft_amt;
switch (atomicity)
{
case 8:
mask = 0xff;
sft_amt = 8;
break;
case 16:
mask = 0xffff;
sft_amt = 16;
break;
default:
/* Invalid atomicity value, return 0x0 */
return 0x0;
}
while (x)
{
t <<= sft_amt;
t |= (x & mask);
x >>= sft_amt;
}
return t;
}
Также посмотрите: http://en.wikipedia.org/wiki/Endianness
РЕДАКТИРОВАТЬ1:
Для структурных / составных данных
Для структуры или некоторого типа динамического размера, который необходимо преобразовать в обратный порядок байтов, может помочь следующая функция:
your_type conv_endian (your_type x)
{
your_type y;
char *arr = (char *) &x;
char *arr_conv = (char *) &y;
int n, i, j;
n = sizeof (your_type);
for (i=n-1, j=0; i>=0; i--, j++)
{
arr_conv[j] = arr[i];
}
return y;
}
Проверьте вышеуказанную функцию с помощью приведенного ниже драйвера:
typedef struct _your_type {
unsigned int a, b;
} your_type;
test conv_endian (your_type x);
int main (void)
{
your_type x, y;
x.a = 0x12ab34cd;
x.b = 0x98ef76af;
y = conv_endian (x);
printf ("\n%x %x", x.a, x.b);
printf ("\n%x %x", y.a, y.b);
printf ("\n");
return 0;
}
РЕДАКТИРОВАТЬ 2:
Для любой структуры
/* x: base address of the memory
* n: length of the memory
*/
void reverse_endian (void *x, int n)
{
char *arr_conv, *arr, t;
arr = arr_conv = (char *) x;
arr += (n-1);
n/=2;
while (n)
{
t = *arr_conv;
*arr_conv = *arr;
*arr = t;
n--;
arr_conv++;
arr--;
}
}
Проверить этот пост Обмен endiannes в C