Преобразование big-endian в litle-endian.
От: Mc_Leod  
Дата: 24.05.04 15:26
Оценка:
Господа, подскажите как руками правильно преобразовать из одного в другое.
Что-то ищу алгоритм и найти не могу.
... << RSDN@Home 1.1.3 stable >>
Re: Преобразование big-endian в litle-endian.
От: Сергей Зизев Украина  
Дата: 24.05.04 15:37
Оценка:
Hello, Mc_Leod!
You wrote on Mon, 24 May 2004 15:26:14 GMT:

ML> Господа, подскажите как руками правильно преобразовать из одного в другое.

ML> Что-то ищу алгоритм и найти не могу.

Если мне не изменяет память, то там обычный сдвиг. Посмотри в MSDN
функции htonl, ntohl

WBR
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re: Преобразование big-endian в litle-endian.
От: Кодт Россия  
Дата: 24.05.04 15:40
Оценка:
Здравствуйте, Mc_Leod, Вы писали:

M_L>Господа, подскажите как руками правильно преобразовать из одного в другое.

M_L>Что-то ищу алгоритм и найти не могу.

Если ты пишешь для интела — то смотри htons/ntohs, htonl/ntohl.
А вообще, чего сложного:
inline unsigned short swapbytesw(unsigned short w) { return (w<< 8)|(w>> 8); }
inline unsigned long  swapwordsd(unsigned long  d) { return (d<<16)|(d>>16); }
inline unsigned long  swapbytesd(unsigned long  d)
 { return (d<<24)|((d & 0xFF00)<<8)|((d & 0xFF0000)>>8)|(d>>24); }
Перекуём баги на фичи!
Re[2]: Преобразование big-endian в litle-endian.
От: Кодт Россия  
Дата: 24.05.04 15:45
Оценка:
Здравствуйте, Сергей Зизев, Вы писали:

СЗ>функции htonl, ntohl


Эти функции кроссплатформенные, означают "host-to-network long", "network-to-host long" (а ещё есть htons/ntohs — "short"). Считается, что "network" — это big-endian. А "host" может быть как little-endian (платформы intel), так и big-endian (motorola и др...).

Поэтому, если тебе нужно перевести из "родного" в "сетевой" и обратно — то используй их. А если заведомо конвертировать big/little — то, соответственно...
Перекуём баги на фичи!
Re[2]: Преобразование big-endian в litle-endian.
От: Mc_Leod  
Дата: 24.05.04 15:46
Оценка:
Здравствуйте, Сергей Зизев, Вы писали:

СЗ>Hello, Mc_Leod!

СЗ>You wrote on Mon, 24 May 2004 15:26:14 GMT:

ML>> Господа, подскажите как руками правильно преобразовать из одного в другое.

ML>> Что-то ищу алгоритм и найти не могу.

СЗ>Если мне не изменяет память, то там обычный сдвиг. Посмотри в MSDN

СЗ>функции htonl, ntohl

СЗ>WBR


мне надо руками...
... << RSDN@Home 1.1.3 stable >>
Re[2]: Преобразование big-endian в litle-endian.
От: Mc_Leod  
Дата: 24.05.04 15:46
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Mc_Leod, Вы писали:


M_L>>Господа, подскажите как руками правильно преобразовать из одного в другое.

M_L>>Что-то ищу алгоритм и найти не могу.

К>Если ты пишешь для интела — то смотри htons/ntohs, htonl/ntohl.

К>А вообще, чего сложного:
К>
К>inline unsigned short swapbytesw(unsigned short w) { return (w<< 8)|(w>> 8); }
К>inline unsigned long  swapwordsd(unsigned long  d) { return (d<<16)|(d>>16); }
К>inline unsigned long  swapbytesd(unsigned long  d)
К> { return (d<<24)|((d & 0xFF00)<<8)|((d & 0xFF0000)>>8)|(d>>24); }
К>


спасибо.
а для signed int?
... << RSDN@Home 1.1.3 stable >>
Re: Преобразование big-endian в litle-endian.
От: _nn_ www.nemerleweb.com
Дата: 24.05.04 15:56
Оценка: 43 (2)
Здравствуйте, Mc_Leod, Вы писали:

M_L>Господа, подскажите как руками правильно преобразовать из одного в другое.

M_L>Что-то ищу алгоритм и найти не могу.

В асме есть такая команда bswap.
Она делает всю грязную работу за вас

__asm
{
    mov eax,0x5f4d3c2a
    bswap eax // eax=2a3c4d5f
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Преобразование big-endian в litle-endian.
От: Кодт Россия  
Дата: 24.05.04 15:58
Оценка:
Здравствуйте, Mc_Leod, Вы писали:

M_L>а для signed int?

signed short swapbytesw(signed short s) { return (signed short)swapbytes((unsigned short)s); }



Поскольку размер int варьируется, то можно либо поизвращаться с type traits, либо втупую:
int swapbytesi(int i)
{
  const n = sizeof(int);
  union
  {
    int i;
    char c[n];
  } u;
  u.i = i;
  for(int k=0; k<n/2; ++k)
  { char c = u.c[k]; u.c[k]=u.c[n-1-k]; u.c[n-1-k] = c; }
  return u.i;
}
Перекуём баги на фичи!
Re[2]: Преобразование big-endian в litle-endian.
От: Mc_Leod  
Дата: 24.05.04 16:00
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Mc_Leod, Вы писали:


M_L>>Господа, подскажите как руками правильно преобразовать из одного в другое.

M_L>>Что-то ищу алгоритм и найти не могу.

К>Если ты пишешь для интела — то смотри htons/ntohs, htonl/ntohl.

К>А вообще, чего сложного:
К>
К>inline unsigned short swapbytesw(unsigned short w) { return (w<< 8)|(w>> 8); }
К>inline unsigned long  swapwordsd(unsigned long  d) { return (d<<16)|(d>>16); }
К>inline unsigned long  swapbytesd(unsigned long  d)
К> { return (d<<24)|((d & 0xFF00)<<8)|((d & 0xFF0000)>>8)|(d>>24); }
К>


а можно просто общий алгоритм?
... << RSDN@Home 1.1.3 stable >>
Re[2]: Преобразование big-endian в litle-endian.
От: SWW Россия  
Дата: 24.05.04 16:39
Оценка:
__>В асме есть такая команда bswap.
__>Она делает всю грязную работу за вас

__>
__>__asm
__>{
__>    mov eax,0x5f4d3c2a
__>    bswap eax // eax=2a3c4d5f
__>}
__>


Я для этого написал простенькую функцию
inline int SwapBytes(int dw)
{
__asm
    {
    mov    eax, dw
    bswap    eax
    }
}

Возвращаемое значение остается в eax
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.