
static union { char c[4]unsigned long mylong} endian_test = {{ 'l', '?', '?', 'b' } }
#define ENDIANNESS ((char)endian_test.mylong)
Linux 的内核作者们仅仅用一个union 变量和一个简单的宏定义就实现了一大段代码同样的功能!由以上一段代码我们可以深刻领会到Linux 源代码的精妙之处!(如果ENDIANNESS=’l’表示系统为little endian,
为’b’表示big endian )
http://blog.chinaunix.net/uid-25367385-id-188322.html
例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中;0x22放在高地址中,即0x0011中。小端模式,刚好相反
一个判断当前系统是大端还是小端的函数,小端则返回1:
以上函数,若在小端系统下,其字节序为,b[0]中存储00000001,后三个字节依次存储00000000,大端系统下反之
在iOS开发中,苹果已经为我们定义好了一套用于大小端转换的宏定义:
NTOHL,network to host,L、S、LL分别对应long、short、long long
HTONL,反之
大小端转换原理如下:
假设一个short类型的数字:0x1122,那么其二进制形式为:00010001 00100010
首先,取出第一个字节,右移八位:
然后,取出第二个字节,左移八位:
最后,按位或,至此,大小端转换完成:
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)