java 主机字节序 网络字节序_网络字节序和主机字节序

1、大端、小端字节序

考虑一个16位整数,它由2个字节组成。内存中存储这两个字节有两种方法:一种是将低序字节存储在起始地址,这称为小端(little-endian)字节序;另一种方法是将高序字节存储在起始地址,这称为大端(big-endian)字节序。如下所示:

35b4f034dd02c761a0292ee162376202.png

术语“大端”和“小端”表示多个字节值的哪一端(小端或大端)存储在该值的起始地址。

遗憾的是,这两种字节序之间没有标准可循,两种格式都有系统使用。比如,Inter x86、ARM核采用的是小端模式,Power PC、MIPS UNIX和HP-PA UNIX采用大端模式。

2、网络字节序和主机字节序

网络字节序

网络字节序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节序采用big endian排序方式。

主机字节序

不同的机器主机字节序不相同,与CPU设计有关,数据的顺序是由cpu决定的,而与操作系统无关。我们把某个给定系统所用的字节序称为主机字节序(host byte order)。比如x86系列CPU都是little-endian的字节序。

由于这个原因不同体系结构的机器之间无法通信,所以要转换成一种约定的数序,也就是网络字节顺序。

网络字节序与主机字节序之间的转换函数:htons(), ntohs(), htons(),htonl(),位于头文件,htons和ntohs完成16位无符号数的相互转换,htonl和ntohl完成32位无符号数的相互转换。

在使用little endian的系统中,这些函数会把字节序进行转换;

在使用big endian类型的系统中,这些函数会定义成空宏;

在网络程序开发时 或是跨平台开发时,也应该注意保证只用一种字节序,不然两方的解释不一样就会产生bug。

3、IP地址的三种表示格式及在开发中的应用

1)点分十进制表示格式

2)网络字节序格式

3)主机字节序格式

用IP地址127.0.0.1为例:

第一步   127     .         0         .         0         .        1                 把IP地址每一部分转换为8位的二进制数。

第二步 01111111     00000000     00000000     00000001      =   2130706433   (主机字节序)

然后把上面的四部分二进制数从右往左按部分重新排列,那就变为:

第三步 00000001     00000000     00000000    01111111        =   16777343        (网络字节序)

eg:

struct sockaddr_in addrSrv;

4、inet_aton()、inet_addr()和inet_aton()函数

头文件:

1)int inet_aton(const char *strptr, struct in_addr *addrptr);

将strptr所指C字符串转换成一个32位的网络字节序二进制值,并通过指针addrptr来存储。若成功则返回1,否则返回0。

2)in_addr_t inet_addr(const char *strptr)

若字符串有效,则返回值为32位的网络字节序二进制值,否则为INADDR_NONE。

该函数存在一个问题,所有2^32个可能的二进制值都是有效的IP地址(0.0.0.0---255.255.255.255),但是当出错时该函数返回INADDR_NONE常值(通常是一个32位均为1的值)。这意味着点分十进制数串255.255.255.255不能由该函数处理,因为它的二进制值用来指示该函数失败。所以该函数已经被废弃,应该尽量用inet_aton()函数,或者将要说到的inet_pton()函数。

3)char *inet_ntoa(struct in_addr inaddr);

将一个32位的网络字节序二进制值IPv4地址转换成相应的点分十进制数串。该函数以一个结构而不是以指向该结构的一个指针作为其参数。

返回:指向一个点分十进制数串的指针

5、inet_pton()和inet_ntop()函数

这两个函数是随着IPv6出现的新函数,对于IPv4地址和IPv6地址都适用。函数名中p和n分别代表表达(presentation)和数值(numeric)。

头文件: 

8f580de8950557717786d5a217d7773d.png

74b2d0671234834cb3233df694f050eb.png

2fbd0a9ced05998808aa47e9e68cee3c.png

0fb44c204feb58730c3ed6d7a0fbd861.png

c3fe07c0d2c154bf08638f29c729bb8c.png

015ae08a52f175a437012833a5ecc212.png

1808ec4baf76e2e1f825cb75e4bef816.png

7b44443ae0f2fc3cc6e0c09b1ab97067.png

22976a34c99c77cc4d45588864744467.png

9b4a691164cbcfba67e25fdd405e7952.png

总结这几个转换函数:

a801de4f714bb5a72160767bda84215c.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值