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系统
例如Follows
int main()
{
unsigned int y = 0x31014950;
unsigned int r = endian_swap( y );
std::cout << r;
}
在Ideone.com上发布的示例是正确的..但它不适用于我
编辑
std::cout << std::hex << r;
Pays Pals .. Hex或Not它没有得到正确的数字.. Visual Studio在它的调试器或我的整机中遇到严重错误..
因为我用更慢的冗余代码替换了整个代码但仍然得到相同的结果
顺便说一句,如果它有任何区别..我正在使用Debugger断开功能后检查结果
答案 0 :(得分:2)
答案 1 :(得分:2)
您的代码似乎是正确的。
以下计划(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
答案 2 :(得分:1)
消除参数说明符中x前面的&符号。你想传递价值。
答案 3 :(得分:0)
您是否对代码进行了单元测试?
在我的平台上,这传递:
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);
}
答案 4 :(得分:0)
编辑中的示例是输出y而不是r。输入y当然不会被修改。
答案 5 :(得分:0)
如果我运行您发布的代码,则会得到正确的结果: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
}
检查您的代码中是否也有类似的差异。
答案 6 :(得分:0)
位操作符没有用,因为它们的操作就好像位从最低有效位到最高有效位的顺序排列,而不管真正的内部字节顺序。
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.