分享免费的编程资源和教程

网站首页 > 技术教程 正文

字节序与ip整型转换问题梳理

goqiw 2024-09-04 18:44:54 技术教程 12 ℃ 0 评论

为什么会有字节序大小端之分呢?因为不同厂商处理器处理数据存放时采取的策略不同。

一个字节8位比特,对于16位或者32位这种位数大于8位的处理器,由于寄存器宽度大于一个字节,必然存在多个字节存放顺序的问题。

小端字节序(LE little-endian):数据低位存储在内存低地址

大端字节序(BE big-endian):数据高位存储在内存低地址

例如,数值 0x12345678(16进制表示的32位整型)

想象内存地址从左向右由低到高,则

小端字节序: 0x78563412

大端字节序: 0x12345678


网络字节序是大端字节序。可以想象,随着传输数据不断增加,内存地址由低到高不断增加,传输过程中数据高位先到达,数据低位后到达,即数据高位存储在内存低地址,最新进行处理。


经常存在的一个误区是,与网络字节序是大端相对应,主机字节序就是小端字节序。其实不然,不同处理器及操作系统类型决定了主机字节序是大端还是小端,不是所有主机字节序都是小端。可以通过运行以下代码获取当前主机是小端还是大端。

那么什么时候需要在大小端字节序之间做转换呢?

TCP/IP 协议栈规定采用大端字节序,即地址(IP/PORT)用网络字节序,故主机字节序如果为小端,需要将通信参数(ip、port等)转换为大端字节序(htonl 或 htons)

自己的应用程序传输的数据,如果通信双方主机字节序一致,可不进行转换,如果不一致,则需要按统一字节序做相应的转换。


字节序与ip整型转换又有什么关系呢?

一个点分十进制ip地址:10.1.30.28

可看做32位整型: 00001010 00000001 00011110 00011100

转换为 10 进制:167845404

转换二进制为网络字节序:00011100 00011110 00000001 00001010

转换为网络字节序后的 10 进制:471728394

调用 inet_addr 函数之后的结果:0x1c1e010a 等于 10进制 471728394

inet_addr 函数的作用是,将点分十进制 IP 地址转换成 网络字节序 IP 地址,即 471728394。

网上很多页面工具提供ip整型转换,通常都是转成 167845404,这一点需要能够清楚区分,尤其在ip限制、地域区分等场景中,字节序弄反会造成困扰。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表