Разве вы не можете просто поменять их местами?
inline unsigned long long EndianChange( double d )
{
char ch[8];
memcpy( ch, &d, 8 ); // Note this will be optimised out completely by pretty much every compiler.
ch[0] ^= ch[7] ^= ch[0] ^= ch[7];
ch[1] ^= ch[6] ^= ch[1] ^= ch[6];
ch[2] ^= ch[5] ^= ch[2] ^= ch[5];
ch[3] ^= ch[4] ^= ch[3] ^= ch[4];
unsigned long long dRet;
memcpy( &dRet, ch, 8 ); // Again this will get optimised out.
return dRet;
};
Редактировать: Как указывалось, двойная переменная «can», замененная байтом, загружается в регистр, так что возвращение его из этого регистра может означать, что значение больше не является допустимым, поэтому сохраняйте его в длинном, длинном, 64-битном, чтобы избежать эта проблема.
Это все, что нужно для обмена байтами. Я не уверен, что вы пытаетесь сделать, но каждая платформа с прямым порядком байтов, которую я когда-либо использовал, использует ту же кодировку, что и little-endian, только в обратном порядке байтов. Приведенный выше код перевернет порядок байтов для вас. Практически любой компилятор просто выполнит замену байтов, а затем вернет переменную замены байтов и избавится от memcpys. Это хороший способ решения проблем с псевдонимами.