字符串IP地址和二进制IP地址的转换

人们理解的IP地址表达方式类似为127.0.0.1,而计算机理解的为一串0x011111110000000…..的表达式。
因此,linux操作系统有一套函数用于网络地址的字符串形式和二进制形式转换
inet_XXX()函数,用于网络地址字符串和二进制形式之间的转换
这里写图片描述

因特网中IP地址(IP地址分类,网络ID,主机ID组成)
主机ID各位(位指的是二进制位)全为1的IP地址用作广播(如192.168.1.255)
IP地址分类(A,B,C,D,E类)
先介绍两个名词
大端字节序:表示内存地址的起始地址存放高字节(网络字节序默认大端字节序)
小端字节序:表示内存地址的起始地址存放低字节
参考大端字节序和小端字节序

例子:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
 int main()  
 {  
     char ip[] = "192.168.1.11";  
     long r1, r2, r3;  //long  
     struct in_addr addr;  
     r1 = inet_addr(ip); //返回网络字节序  
     if(-1 == r1){  
         printf("inet_addr return -1\n");  
     }else{  
         printf("inet_addr ip: 0x%x\n", r1);  
    }  
     r2 = inet_network(ip);    //返回主机字节序  
     if(-1 == r2){  
         printf("inet_addr return -1\n");  
     }else{  
         printf("inet_network ip: 0x%x\n", r2);   
         printf("inet_network ip: 0x%x\n", htonl(r2));   // 主机字节序 ——> 网络字节序    
     }  
      r3 = inet_aton(ip, &addr);  //返回网络字节序  
          if(0 == r3){
         printf("inet_aton error!\n");
     }else{
         printf("inet_aton ip: 0x%x\n", addr.s_addr);
     }
输出:
inet_addr ip: 0xb01a8c0
inet_network ip: 0xc0a8010b
inet_network ip: 0xb01a8c0
inet_aton ip: 0xb01a8c0

注:inet_addr:返回网络字节序,将点分十进制字符串IP地址转换为二进制IP地址
inet_network:返回主机字节序,将点分十进制字符串IP地址转换为二进制IP地址
inet_aton:返回网络字节序,将点分十进制字符串IP地址转换为二进制IP地址
inet_ntoa:返回点分十进制字符串

例子:

#include<stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
void main()
{
    char *source="192.168.1.11";
    struct in_addr addr_ip;
     if( 0 == inet_aton(source,&addr_ip))  //返回网络字节序
     {

         printf("inet_aton error \n");
     }
     printf("netip=0x%x,hostip=0x%x\n", addr_ip.s_addr,ntohl(addr_ip.s_addr));                                      
     printf("inet_aton=%s\n",inet_ntoa(addr_ip));  //返回点分十进制字符串
 }
输出:
netip=0xb01a8c0,hostip=0xc0a8010b
inet_aton=192.168.1.11

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值