[英]Little Endian - Big Endian Problem
Little Endian vs Big Endian
Big Endian = 0x31014950
Little Endian = 0x50490131
但是使用此方法
inline unsigned int endian_swap(unsigned int& x)
{
return ( ( (x & 0x000000FF) << 24 ) |
( (x & 0x0000FF00) << 8 ) |
( (x & 0x00FF0000) >> 8 ) |
( (x & 0xFF000000) >> 24 ) );
}
結果= 0x54110131
我花了很多時間嘗試很多類似的方法,甚至是一個類似的庫
unsigned long _byteswap_ulong(unsigned long value);
但仍然沒有運氣..所有返回相同的結果
編輯
我正在使用Microsoft Visual Studio 2008開發Little-Endian系統
示例如下
int main()
{
unsigned int y = 0x31014950;
unsigned int r = endian_swap( y );
std::cout << r;
}
在Ideone.com上發布的示例是正確的..但它不適用於我
編輯
std::cout << std::hex << r;
無論是方式伙伴..十六進制或不是它沒有得到正確的數字.. Visual Studio在它的調試器或我的整機中遇到嚴重的錯誤..
因為我用更慢的冗余代碼替換了整個代碼,但仍然得到相同的結果
順便說一句,如果它有任何區別..我正在使用調試器斷開功能后檢查結果
你的代碼似乎是正確的。
以下程序( http://ideone.com/a5TBF ):
#include <cstdio>
inline unsigned int endian_swap(unsigned const int& x)
{
return ( ( (x & 0x000000FF) << 24 ) |
( (x & 0x0000FF00) << 8 ) |
( (x & 0x00FF0000) >> 8 ) |
( (x & 0xFF000000) >> 24 ) );
}
int main()
{
unsigned int x = 0x12345678;
unsigned int y = endian_swap(x);
printf("%x %x\n", x, y);
return 0;
}
輸出:
12345678 78563412
編輯:
你需要std::cout << std::hex << r
,否則你打印(1)錯誤變量,(2)十進制:-)
請參閱此示例: http : //ideone.com/EPFz8
消除參數說明符中x前面的&符號。 你想傳遞價值。
您是否對代碼進行了單元測試?
在我的平台上,這通過:
void LittleEndianTest::testLittleEndian()
{
unsigned int x = 0x31014950;
unsigned int result =
(
( (x & 0x000000FF) << 24 ) +
( (x & 0x0000FF00) << 8 ) +
( (x & 0x00FF0000) >> 8 ) +
( (x & 0xFF000000) >> 24 )
);
CPPUNIT_ASSERT_EQUAL((unsigned int)0x50490131, result);
}
編輯中的示例是輸出y而不是r。 當然,輸入y不會被修改。
如果我運行您發布的代碼,它會給出正確的結果: endian_swap ( 0x31014950 ) == 0x50490131
。
要得到結果: endian_swap ( 0x31014950 ) == 0x54110131
,您的代碼必須等效於此:
#define __
inline unsigned int endian_swap(unsigned int& x)
{ //0x31014950 -> 0x54110131
return ( ( (x & 0x000000FF) << 24 ) | // 50
__ ( (x & 0x00F0F000) << 12 ) | // 4
__ ( (x & 0x00FF0000) << 4 ) | // 1
__ ( (x & 0x00FF0000) << 0 ) | // 1
__ ( (x & 0x00FF0000) >> 8 ) | // 01
__ ( (x & 0xFF000000) >> 24 ) ); // 31
}
檢查您的代碼中是否也有類似的差異。
位運算符沒有用,因為它們的操作就好像位從最低有效位到最高有效位的順序排列,而不管真正的內部字節順序如何。
void isBigEndian()
{
void *number;
number = (int *) new int(0x01000010);
// 0x01000010
// 01 00 00 10 Hexadecimal
// 0 1 0 0 0 0 1 0
// 0000 0001 0000 0000 0000 0000 0001 0000 Bit
// 1 0 0 16 Decimal
char *byte;
byte = (char *)number;
cout << static_cast<int>(*byte);//prints 16: Little Endian
}
您更改上面的數字,並在BigEndian時返回1。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.