[英]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.