关于大小字节序,之前反复使用各种方式记,过段时间又忘。遇到的时候经常又要查。
今天突然想到一个比较合理的办法,可以解决这个问题:
以内存中低地址为中心:
1. 如果存放的是数据的低字节,就是小字节序
2. 如果存放的是数据的高字节,就是大字节序
附上一个测试自己机子大小字节序的程序:
#include
#include
int
main(void)
{
union{
short st;
char ch;
}un;
un.st = 0x12;
if(un.ch == 0x12)
{
printf("This is little endian!\n");
}
else
{
printf("This is big endian!\n");
}
}
Oh, my god. 保佑我以后不会再forget。
在此标记!
-------------------------------------------------分割线------------------------------------------
以上是众所周知的一个知识点,而且要注意到一点,以上分析都是以字节为单位进行的。
一直有个疑问: 在一个字节中,比特位的存放顺序是否也有大小端之分??
但是之前有一次看网络的相关代码时候,网络中的代码一直都会某个type或者len占用的并不是以字节为单
位的,有时候type会用到仅仅两个bit位。如此一来在编程中就会有一个宏定义来分割是大端还小端的环境。
因此同一个字节里面也是有大小端之分的!!!!
今天在看代码时候又看到相应的证据,贴出供参考下
环境是IPv6中对相应的IPv6的ip根据plen进行mask(以下代码是在大端字节序的环境下使用的)
- int
- prefix6_mask(in6, plen)
- struct in6_addr *in6;
- int plen;
- {
- struct sockaddr_in6 mask6;
- int i;
-
- if (sa6_plen2mask(&mask6, plen))
- return (-1);
- for (i = 0; i < 16; i++)
- in6->s6_addr[i] &= mask6.sin6_addr.s6_addr[i];
-
- return (0);
- }
-
- int
- sa6_plen2mask(sa6, plen)
- struct sockaddr_in6 *sa6;
- int plen;
- {
- u_char *cp;
- if (plen < 0 || plen > 128)
- return (-1);
- memset(sa6, 0, sizeof(*sa6));
- sa6->sin6_family = AF_INET6;
- #ifdef HAVE_SA_LEN
- sa6->sin6_len = sizeof(*sa6);
- #endif
- for (cp = (u_char *)&sa6->sin6_addr; plen > 7; plen -= 8)
- *cp++ = 0xff;
- *cp = 0xff << (8 - plen);
-
- return (0);
- }
阅读(2014) | 评论(0) | 转发(0) |