相关文章推荐
任性的烤面包  ·  字符与字节有什么区别呢?-腾讯云开发者社区-腾讯云·  1 年前    · 
任性的烤面包  ·  数据类型范围| Microsoft Learn·  1 年前    · 
任性的烤面包  ·  一文帮你彻底弄懂编码/字节/字符- 知乎·  1 年前    · 
任性的烤面包  ·  编码和解码(字符串与byte[]之间的转换) ...·  1 年前    · 
任性的烤面包  ·  字节码:ASCII编码:单字节编码,ANSI ...·  1 年前    · 
小百科  ›  网络字节序和IP地址探析_网络序十进制-CSDN博客
字节序标记(BOM) 字节序 十进制 网络字节序
精明的蚂蚁
1 年前
  • 一、网络字节序
    • 1、大端模式和小端模式
    • 2、判断大端模式和小端模式
    • 3、大端模式和小端模式相互转换
  • 二、字节序转换函数
  • 三、IP地址详解
    • 1、IP地址的概念
    • 2、IP地址的两种表示方法:整数和点分十进制
    • 3、判断IP地址是否合法
  • 四、IP地址转换
    • 1、将点分十进制数串转换成 32 位无符号整数
    • 2、将 32 位无符号整数转换成点分十进制数串

    一、网络字节序

    1、大端模式和小端模式

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

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

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

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

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

    #include <stdio.h>  
    int main(int argc, charchar *argv[])  
        unsigned int a = 0x12345678;  
        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 <arpa/inet.h>
    // 将 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 <arpa/inet.h>
    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 <stdio.h>  
    #include <arpa/inet.h>  
    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 <arpa/inet.h>
    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://blog.csdn.net/lianghe_work/article/details/45170285
    https://blog.csdn.net/Esther_Heesch/article/details/51476811
    https://blog.csdn.net/weixin_36525275/article/details/79456065
    https://blog.csdn.net/u014259820/article/details/78833196

    一、网络字节序  字节序是指多字节数据的存储顺序,在设计计算机系统的时候,有两种处理内存中数据的方法:大端格式、小端格式。小端格式(Little-Endian):将低位字节数据存储在低地址;大端格式(Big-Endian):将高位字节数据存储在低地址。  举个简单的例子,对于整形 0x12345678,它在大端格式和小端格式的系统中,分别如下图所示的方式存放:【下面例子为确定主机...
    网络字节序 网络字节序1、网络字节序 (Network Byte Order)和本机转换2、字节序转换函数 网络字节序 1、网络字节序 (Network Byte Order)和本机转换 1、大端、小端字节序 “大端”和”小端”表示多字节值的哪一端存储在该值的起始地址处;小端存储在起始地址处,即是小端字节序;大端存储在起始地址处,即是大端字节序;具体的说: ①大端字节序(Big Endian):最高有效位存于最低内存地址处,最低有效位存于最高内存处; ②小端字节序(Little Endian):最高有效位
      之前我们在学习内存的时候可知,内存存储数据也是有大端存储和小端存储的,对于网络数据流同样有大端小端之分,那么为什么要定义网络字节序呢?   原因是让不同cpu架构的计算机进行网络通信时,字节序不会混淆,因此tcp/ip协议规定了在网络中传输的字节流数据采用大端字节序。 图1-大端字节序   通常,发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把...
    在网络编程中,分为主机字节序和网络字节序。字节序分为大端和小端问题。网络字节序约定以大端为主,而主机就没有这样的约定,在Windows、Linux、Mac等主机上可能就是大小端的其中一种。 例如有这样一个十六进制数字0x12345678,它占了4个字节,每个字节8位,两个16进制占8位(一个16进制为24 ,两个16进制为28 )。这个高字节位是最让人迷惑的地方,比如上面这个数,高字节位就是挨着0...
    IP、主机字节序、网络字节序、互转 ------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Threading.Tasks; namespace _012网络_主机_字节序 class Program static void Main(string[] args) int s = NetEndianHostEndianIP.iPnetEndian("127.0.0.1"); Console.WriteLine("IP转换网络字节序后值为:{0}", s); string ss = NetEndianHostEndianIP.netEndianIp(s); Console.WriteLine("网络字节序转换IP后值为:{0}", ss); Console.ReadKey();
 
推荐文章
任性的烤面包  ·  字符与字节有什么区别呢?-腾讯云开发者社区-腾讯云
1 年前
任性的烤面包  ·  数据类型范围| Microsoft Learn
1 年前
任性的烤面包  ·  一文帮你彻底弄懂编码/字节/字符- 知乎
1 年前
任性的烤面包  ·  编码和解码(字符串与byte[]之间的转换) - ProZkb - 博客园
1 年前
任性的烤面包  ·  字节码:ASCII编码:单字节编码,ANSI编码:多字节编码 ...
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
小百科 - 百科知识指南
© 2024 ~ 沪ICP备11025650号