字节排序函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字节排序函数相关的知识,希望对你有一定的参考价值。

考虑一个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\n");
		else if (un.c[0] == 2 && un.c[1] == 1)
			printf("little-endian\n");
		else
			printf("unknown\n");
	} else
		printf("sizeof(short) = %d\n", 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

以上是关于字节排序函数的主要内容,如果未能解决你的问题,请参考以下文章

字节排序函数

java缓冲字符字节输入输出流:java.io.BufferedReaderjava.io.BufferedWriterjava.io.BufferedInputStreamjava.io.(代码片段

Spring Rest 文档。片段生成时 UTF-8 中间字节无效 [重复]

php函数返回意外 (可能是unicode或字节码引起的)

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段