主机字节序和网络字节序详解 深入解析主机字节序与网络字节序
主机字节序和网络字节序详解
文章导读:主机字节序和网络字节序详解IT技巧方面的经验,接下来就是全面介绍。
主机字节序
网络通信本质上是不同的机器进行数据交换,一般不同的机器有着不同的 CPU 型号,不同的 CPU 其字节序可能不一样。
所谓字节序指的是对于存储需要多个字节(大于 1 字节)的整数来说,其每个字节在不同的机器内存中存储的顺序。
这就是所谓的主机字节序,一般分为两类:
- little-endian(LE,俗称小端编码或小头编码)对于一个整数值,如果使用小端字节序,整数的高位存储在内存地址高的位置,整数的低位存储在内存地址低的位置上(所谓的高高低低),这种序列比较符合人的思维习惯。Intel x86 系列的系统使用的是小端编码方式。
- big-endian(BE,俗称大端编码或大头编码)对于一个整数值,如果使用大端字节序,整数的高位存储在内存地址低的位置,整数的低位存储在内存地址高的位置上(所谓的高低低高),这是最直观的字节序。Java 程序、Mac 机器上的程序一般是大端编码方式。
举个例子,对于内存中双字值 0x10203040 (4 字节)的存储方式,如果使用小端编码,其内存中存储方式如下:

如果使用大端编码 来存储 0x10203040,在内存中存储示意图如下:

关于大端和小端一词来源于《格列佛游记》中的小人国故事,小人国中的两个国家因为吃鸡蛋应该先从鸡蛋的大端还是小端先磕破这一“宗教信仰”问题水火难容,频繁发生战争。
网络字节序
网络字节序是 TCP/IP 协议中规定好的一种数据表示格式,它与具体的 CPU 类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释,网络字节顺序采用 big-endian 排序方式。
因此为了不同的机器和系统可以正常交换数据,一般建议将需要传输的整型值转换成网络字节序,我们前面代码中使用端口时即将端口号数值从本地字节序转换成网络字节序:
//2.初始化服务器地址
struct sockaddr_in bindaddr;
bindaddr.sin_family = AF_INET;
bindaddr.sin_addr.s_addr = htonl(INADDR_ANY);
//将端口号3000转换成网络字节序
bindaddr.sin_port = htons(3000);
if (bind(listenfd, (struct sockaddr *)&bindaddr, sizeof(bindaddr)) == -1)
{
std::cout << "bind listen socket error." << std::endl;
return -1;
}
相关阅读
-
802.11标准的技术特点有哪些?
如果想知道802.11标准的技术特点有哪些的内容,接下来分享详细内容。 802.11是一组无线局域网(WLAN)标准,由IEEE(Institute of Electrical and Electronics Engineers)制定和发布。 这些标准规定了无线网
-
首选dns的服务器地址是多少 手动设置IP地址和DNS
一篇IT技术小知识,为您介绍首选dns的服务器地址是多少和手动设置IP地址和DNS方面的知识,一起跟随小编看看吧! 现在IPV6现在离我们越来越近了,我们很多地方的网络运营商已经提供IPv6的网
-
用html5制作网页步骤 html做一个简单的网页教学
跟大家分享用html5制作网页步骤和html做一个简单的网页教学的IT知识,下面为详细的介绍。 网页是一个包含HTML标签的纯文本文件 网页制作离不开 浏览器 和 制作网页工具 浏览器推荐【谷歌浏
-
什么是混合云 有哪些优缺点?
本文核心导读:什么是混合云的电脑方面的小经验,接下来分享详细内容。 混合云结合了公共云和私有云的特点,允许数据和应用程序在两者之间进行流动。 混合云的多样性 混合云可以由多


