网络字节序和IP地址详解

网络字节序和IP地址详解一 网络字节序 字节序是指多字节数据的存储顺序 在设计计算机系统的时候 有两种处理内存中数据的方法 大端格式 小端格式 小端格式 Little Endian 将低位字节数据存储在低地址 大端格式 Big Endian 将高位字节数据存储在低地址 举个简单的例子 对于整形 0x 它在大端格式和小端格式的系统中 分别如下图所示的方式存放 下面例子为确定主机

一、网络字节序

1、大端模式和小端模式

  字节序是指多字节数据的存储顺序,在设计计算机系统的时候,有两种处理内存中数据的方法:大端格式、小端格式。

  • 小端格式(Little-Endian):将低位字节数据存储在低地址;
  • 大端格式(Big-Endian):将高位字节数据存储在低地址。
    在这里插入图片描述

  举个简单的例子,对于整形 0x,它在大端格式和小端格式的系统中,分别如下图所示的方式存放:
在这里插入图片描述

2、判断大端模式和小端模式

【下面例子为确定主机的字节序】:

#include  
      int main(int argc, charchar *argv[]) { 
    unsigned int a = 0x; unsigned char *p = (unsigned char *)&a; // 取低地址上的数据 if(0x12 == *p){ 
    printf("Big-Endian\n"); }else if(0x78 == *p){ 
    printf("Little-Endian\n"); } return 0; } 

  网络字节序定义:收到的第一个字节被当作高位看待,这就要求发送端发送的第一个字节应当是高位。而在发送端发送数据时,发送的第一个字节是该数字在内存中起始地址对应的字节。可见多字节数值在发送前,在内存中数值应该以大端法存放。

  所以,网络协议指定了通讯字节序:大端只有在多字节数据处理时才需要考虑字节序,运行在同一台计算机上的进程相互通信时,一般不用考虑字节序,异构计算机之间通讯,需要转换自己的字节序为网络字节。主机字节序是小端,所以才需要进行字节序转换。

3、大端模式和小端模式相互转换

  使用移位运算:

uint32_t reversebytes_uint32t(uint32_t value){ 
    return (value & 0x000000FFU) << 24 | (value & 0x0000FF00U) << 8 | (value & 0x00FF0000U) >> 8 | (value & 0xFF000000U) >> 24; } 
上述代码中,将低8位(0~8位)左移24位,变成了高8位(24~32位),8~16位左移8位变成了 (16~24位)。将原高8位和高16位右移,变成了新的低8位和低16位。 

二、字节序转换函数

#include  
     // 将 32位主机字节序数据转换成网络字节序数据 //(h:host, n:net,l:long) uint32_t htonl(uint32_t hostint32); // 将 16 位主机字节序数据转换成网络字节序数据 uint16_t htons(uint16_t hostint16); // 将 32 位网络字节序数据转换成主机字节序数据 uint32_t ntohl(uint32_t netint32); // 将 16 位网络字节序数据转换成主机字节序数据 uint16_t ntohs(uint16_t netint16); 

三、IP地址详解

1、IP地址的概念

  IP地址分为网络IP和主机IP:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述






  • A类地址第一字节为网络ID,后三个字节为主机ID,范围是1.0.0.0到126.255.255.255; 默认子网掩码:255.0.0.0;
  • B类地址第一二字节为网络ID,后两个字节为主机ID,范围是128.0.0.0到191.255.255.255; 默认子网掩码:255.255.0.0;
  • C类地址前三个字节为网络ID,最后一个字节为主机ID,范围是192.0.0.0到223.255.255.255;默认子网掩码:255.255.255.0;
  • D类地址用于组播,前四位为1110,范围是224.0.0.0到239.255.255.255;
  • E类地址用于研究,前五位为11110,范围是240.0.0.0到247.255.255.255。

2、IP地址的两种表示方法:整数和点分十进制

点分十进制->整数:点分十进制->十六进制->十进制(整数)。

整数->点分十进制:十进制(整数)->十六进制->每个字节转换为十进制(整数)。

3、判断IP地址是否合法

  • IP的格式为:(1~255).(0~255).(0~255).(0~255)
  • 以小数点开头为非法IP,如:.x.x.x.或者.x.x.xx;
  • 以小数点结尾为非法IP,如:x.x.x.x.;
  • 输入带0开头为非法IP,如:0x.0xx.0x.00x。

四、IP地址转换

1、将点分十进制数串转换成 32 位无符号整数

#include  
     int inet_pton(int family, const char *strptr, void *addrptr); 
  • 功能: 将点分十进制数串转换成 32 位无符号整数。
  • 参数:
    • family:协议族( AF_INET、AF_INET6、PF_PACKET 等 ),常用 AF_INET;
    • strptr:点分十进制数串;
    • addrptr:32 位无符号整数的地址。
  • 返回值: 成功返回 1 ,失败返回其它。
#include  
      #include  
      int main() { 
    char ip_str[]="172.20.223.75"; unsigned int ip_uint = 0; unsigned charchar *ip_p = NULL; inet_pton(AF_INET,ip_str,&ip_uint); printf("in_uint = %d\n",ip_uint); ip_p = (charchar *)&ip_uint; printf("in_uint = %d,%d,%d,%d\n",*ip_p, *(ip_p+1),*(ip_p+2),*(ip_p+3)); return 0; } 

2、将 32 位无符号整数转换成点分十进制数串

#include  
     const char *inet_ntop( int family, const void *addrptr, char *strptr, size_t len ); 
  • 功能: 将 32 位无符号整数转换成点分十进制数串。
  • 参数:
    • family:协议族( AF_INET、AF_INET6、PF_PACKET 等 ),常用 AF_INET;
    • addrptr:32 位无符号整数;
    • strptr:点分十进制数串;
    • len:strptr 缓存区长度;
      • #define INET_ADDRSTRLEN 16 // for ipv4
      • #define INET6_ADDRSTRLEN 46 // for ipv6
  • 返回值: 成功:则返回字符串的首地址,失败:返回 NULL
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/220977.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午7:12
下一篇 2026年3月17日 下午7:12


相关推荐

  • axisfault faultcode_转付证明怎么写

    axisfault faultcode_转付证明怎么写2007-06-26关于AxisFault的说明一般说来,不可避免的WebService的服务中也会出现异常,举个简单的例子,一个服务接受一个SOAP请求消息,获取有效负载后,进行一个数据库更新操作,而在更新操作过程中发生了SQLException,这个时候就需要告诉客户端(调用WebService)出现异常了,Axis2将异常封装成为一个AxisFault进行抛出。任何类型的…

    2025年11月8日
    4
  • 青龙面板从零搭建教程(一)

    青龙面板从零搭建教程(一)大家好,QX系列教程教会了大家js脚本挂机的基础玩法,Boxjs为这个玩法提升了不少可玩性,但是IOS系统下最多支持2个账号,许多助力需求无法满足,应群友要求出一个青龙从零开始搭建教程,欢迎大家入群交流:106511927注意教程看不懂的话可以进群找群主帮你代挂!如果本教程看不懂或者操作出现问题,证明您的计算机专业知识并不支持本文章的搭建操作。第一步购买云服务器个人推荐阿里云服务器1核2G即可搞活动一年一百来块钱系统选择CentOs7等待配置完成。百度搜索Finalshell下载安装

    2022年6月13日
    84
  • OpenClaw一键部署教程合集:阿里云、腾讯云、百度云和京东云随便选!

    OpenClaw一键部署教程合集:阿里云、腾讯云、百度云和京东云随便选!

    2026年3月15日
    2
  • c++0xc0000005解决方案_蓝屏代码0xc0000005

    c++0xc0000005解决方案_蓝屏代码0xc0000005[HandleProcessCorruptedStateExceptions]//捕获c++异常[SecurityCritical]//捕获c++异常publicvoidxxx(){try{}catch(…

    2026年4月16日
    9
  • http 400报错

    http 400报错http400报错—springmvc相关:1.使用了json入参,传递给了对象,如果对象里的属性,如这里的Bonus是int类型,你传入了非int类型,这里就会报4002.使用了@RequestBody,然而信息头ContentType是非application/json,如:application/x-www-form-urlencoded,也会报400转载于:https:…

    2022年6月11日
    47
  • 巡检,不再要你磨破机房门槛

    巡检,不再要你磨破机房门槛

    2021年8月1日
    65

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号