2014-02-13 4 views
2

Я пытаюсь преобразовать переменную char из большого endian в little endian.Преобразование char из большого endian в little endian в C

Вот именно:

char name[12]; 

Я знаю, как преобразовать Int между большим и маленьким обратным порядком байтов, но полукокс Мессинг меня.

Я знаю, что мне нужно сначала преобразовать его в целочисленную форму, что у меня есть.

Для преобразования Int это то, что я использовал:

(item.age >> 24) | ((item.age >> 8) & 0x0000ff00) | ((item.age << 8) & 0x00ff0000) | (item.age << 24); 

Для преобразования полукокса, я хотел бы сделать это таким же образом, если это возможно, только потому, что это единственный способ, которым я понимаю как.

ответ

8

Endianess влияет только на порядок байтов. Так как char - это точно один байт, то он одинаковый во всех форматах endianess.

И как примечание: вы можете посмотреть функции преобразования порядок байтов в LIBC:

htonl, htons 
ntohl, ntohs 
+1

Так что мне не нужно что-то делать с этим? –

+1

@PM Нет :) Не беспокойтесь о 'char'. –

+1

@PM: все будет отличаться для широких символов, 'wchar_t'. – alk

3

Байт порядка (а.к.а. Endian-Несс) не имеет никакого значения, когда речь идет о типах однобайтными.

Хотя char name[12] состоит из 12 байтов, размер его типа - один байт.

Так что вам не нужно ничего с ним не делать ...

Кстати, размер int не обязательно 4 байта на все компилятор, так что вы можете использовать более общий метод преобразования (для любого тип):

char* p = (char*)&item; 
for (int i=0; i<sizeof(item)/2; i++) 
{ 
    char temp = p[i]; 
    p[i] = p[sizeof(item)-1-i]; 
    p[sizeof(item)-1-i] = temp; 
} 
+0

+1 о варианте 'int' размер. – chux

+0

Спасибо @chux, я думаю, что я должен вам примерно половину моих баллов :) –

+0

Я знаю, но я уже знал, с каким размером int я бы имел дело, спасибо. –

Смежные вопросы