自己的网络字节序转换代码(大小端字节序)

#include <stdio.h>
#define BIGENDIAN    1
#define LITTLEENDIAN 0




//定义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))


static int bigEndianTest()
{
union
{
int a;
char b;
}c;
c.a=1;
if(c.b==1)
return LITTLEENDIAN;
else 
return BIGENDIAN;
}


unsigned int a=0x1122;
#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  
void main()
{


if(LITTLEENDIAN==bigEndianTest())
;
BigEndian_16(a);
printf("%x\n",a);
unsigned long int b=0x12345678;
printf("%x\n",SWAP32(b));
long long int c=0x0123456789abcdef;
printf("%llx\n",SWAP64(c));
printf("%s\n",__FUNCTION__);
}
阅读更多
换一批

没有更多推荐了,返回首页