字节排序函数

考虑一个16位整数,它由2个字节组成。内存中存储这2个字节有2种方法:

一种是将低序字节存储在起始地址,称为小端(little-endian)字节序

另一种方法是将高序字节存储在起始地址,称为大端(big-endian)字节序

我们把系统所采用的字节序称为主机自己序(host byte order)

#include	"unp.h"

int
main(int argc, char **argv)
{
	union {
	  short  s;
          char   c[sizeof(short)];
    } un;

	un.s = 0x0102;
	printf("%s: ", CPU_VENDOR_OS);
	if (sizeof(short) == 2) {
		if (un.c[0] == 1 && un.c[1] == 2)
			printf("big-endian
");
		else if (un.c[0] == 2 && un.c[1] == 1)
			printf("little-endian
");
		else
			printf("unknown
");
	} else
		printf("sizeof(short) = %d
", sizeof(short));

	exit(0);
}

当一个短整数变量中存放2个字节的值0x0102,然后查看它的两个连续字节c[0]和c[1],以此确定字节序

字符串CPU_VENDOR_OS标识CPU类型、厂家和操作系统版本

既然网络协议必须指定一个网络字节序(network byte order),作为网络编程人员必须清楚不同字节序的差异

网际协议使用大端字节序来传送这些多字节整数

主机字节序和网络字节序的转换:

h:host

n:network

s:short

l:long

返回网络字节序的函数:

uint16_t htons(uint16_t host16bitvalue);

uint32_t htonl(uint32_t host32bitvalue);

返回主机字节序的函数:

uint16_t ntohs(uint16_t net16bitvalue);

uint32_t ntohl(uint32_t net32bitvalue);

因特网标准中另一个重要的约定就是位序

最左边的位是最早出现的最高有效位

注意位序的编号是从0开始的,分配给最高有效位的编号是0

========================if i have some wrong, please give me a message, thx.========================
原文地址:https://www.cnblogs.com/ailx10/p/5347464.html