http://blog.csdn.net/hongqun/article/details/6092210
在计算机科学领域中,是指存放多字节数据的字节(byte)的顺序,典型的情况是整数在内存中的存放方式和网络传输的传输顺序。不同的处理器所采用的字节序可能是不同的,例如: ,, , ,和 都是采用小端字节序,而 Motorola 、 , , 和 则采用大端字节序。另外,网络协议通常也会规定其所采用的字节序,还有像java这样的语言,也是规定了字节序的(tcp/ip和java都是采用大端字节序)。
通常,系统中会提供ntohs、htons、ntohl、htonl这4个函数,已实现16位和32位本地字节序和网络字节序的转换。但是,目前好像还没有提供64位数据字节序的转换函数。所以,在这里自己动手写一个。
首先,我们要判断本地系统所采用的字节序:
-
#define BigEndian 1
-
#define LittleEndian 0
-
static bool BigEndianTest()
-
{
-
-
-
-
-
-
-
const __int16 n = 1;
-
if(*(char *)&n)
-
{
-
return LittleEndian;
-
}
-
return BigEndian;
-
}
当然这里可以再优化一下,写成宏定义。
然后,定义16、32、64位的调位函数。这里就是字节“搬家”而已。
-
#define Swap16(s) ((((s) & 0xff) << 8) | (((s) >> 8) & 0xff))
-
#define Swap32(l) (((l) >> 24) | /
-
(((l) & 0x00ff0000) >> 8) | /
-
(((l) & 0x0000ff00) << 8) | /
-
((l) << 24))
-
#define Swap64(ll) (((ll) >> 56) |/
-
(((ll) & 0x00ff000000000000) >> 40) |/
-
(((ll) & 0x0000ff0000000000) >> 24) |/
-
(((ll) & 0x000000ff00000000) >> 8) |/
-
(((ll) & 0x00000000ff000000) << 8) |/
-
(((ll) & 0x0000000000ff0000) << 24) |/
-
(((ll) & 0x000000000000ff00) << 40) |/
-
(((ll) << 56)))
最后,
-
#define BigEndian_16(s) BigEndianTest() ? s : Swap16(s)
-
#define LittleEndian_16(s) BigEndianTest() ? Swap16(s) : s
-
#define BigEndian_32(l) BigEndianTest() ? l : Swap32(l)
-
#define LittleEndian_32(l) BigEndianTest() ? Swap32(l) : l
-
#define BigEndian_64(ll) BigEndianTest() ? ll : Swap64(ll)
-
#define LittleEndian_64(ll) BigEndianTest() ? Swap64(ll) : ll
现在,我们来测试一下:
-
int main()
-
{
-
unsigned __int16 i16 = 0xabcd;
-
unsigned __int32 i32 = 0x0a0b0c0d;
-
unsigned __int64 i64 = 0x0102030405060708;
-
printf("System is %s/n",BigEndianTest() ? "BigEndian" : "LittleEndian" );
-
printf("__int16 i16 = 0x%x, BigEndian:0x%x htons:0x%x, LittleEndian:0x%x ntohs:0x%x/n",
-
i16,BigEndian_16(i16),htons(i16),LittleEndian_16(i16),ntohs(BigEndian_16(i16)));
-
printf("__int32 i32 = 0x%x, BigEndian:0x%x htons:0x%x, LittleEndian:0x%x ntohs:0x%x/n",
-
i32,BigEndian_32(i32),htonl(i32),LittleEndian_32(i32),ntohl(BigEndian_32(i32)));
-
printf("__int64 i64 = 0x%llx, BigEndian:0x%llx, LittleEndian:0x%llx/n",i64,
-
BigEndian_64(i64),LittleEndian_64(i64));
-
getchar();
-
return 0;
-
}
运行结果如下:
-
System is LittleEndian
-
__int16 i16 = 0xabcd, BigEndian:0xcdab htons:0xcdab, LittleEndian:0xabcd ntohs:0
-
xabcd
-
__int32 i32 = 0xa0b0c0d, BigEndian:0xd0c0b0a htons:0xd0c0b0a, LittleEndian:0xa0b
-
0c0d ntohs:0xa0b0c0d
-
__int64 i64 = 0x102030405060708, BigEndian:0x807060504030201, LittleEndian:0x102
-
030405060708
阅读(3523) | 评论(0) | 转发(0) |