HJ33 整数与IP地址间的转换

本文介绍了如何使用C++编程语言将IP地址从点分十进制形式转换为二进制表示的10进制数,并演示了如何进行反向转换。主要涉及字符串转数字和256进制转换的函数如stoi和stoll。

描述

原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字             相对应的二进制数
10                   00001010
0                    00000000
3                    00000011
193                  11000001

组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。

数据范围:保证输入的是合法的 IP 序列

输入描述:

输入 
1 输入IP地址
2 输入10进制型的IP地址

输出描述:

输出
1 输出转换成10进制的IP地址
2 输出转换后的IP地址

示例1

输入:

10.0.3.193
167969729

输出:

167773121
10.3.3.193

代码

#include<cstdio>
#include<string>
#include<vector>
using namespace std;

/*
    IP地址 ==> 十进制(看作是256进制转化为10进制)
    1)提取IP地址4部分整数
    2)4部分整数看作256进制数 ==> 十进制整数

    十进制数 ==> IP地址
    1)字符串 ==> 整数
    2)十进制整数 ==> 4个256进制数

*/


long long to_D(vector<int> vec) //256进制 --> 十进制
{
    long long num=0;
    int r=1;
    for(int i=vec.size()-1;i>=0;i--)
    {
        num+=vec[i]*r;
        r*=256;

    }
    return num;
}

int main()
{
    // ---------1.读取数据-------------------------
        // IP地址
    char buf1[100];
    fgets(buf1,100,stdin);
    string str1=buf1;
        // 10进制型IP地址
    char buf2[100];
    fgets(buf2,100,stdin);
    string str2=buf2;

    // ---------2 IP地址处理---------------------------
    
    // 2.1 提取IP地址4部分整数
    string num="";
    vector<int> vec1;//存放四个整数
    for(int i=0;i<str1.size();i++)
    {
        if(str1[i]>='0' && str1[i] <='9')
        {
            num.push_back(str1[i]);
        }
        else {
            vec1.push_back(stoi(num)); //stoi():字符串 --> 整数
            num="";
        }
    }
    // 2.2 4部分十进制 ==> 十进制整型
    long long IP_d=to_D(vec1);//保存十进制IP地址
    
    //----------3.十进制IP地址处理--------------------------
    
    // 3.1 字符串 ==> long long型
    long long IP=stoll(str2);// str型 --> long long型
    // 3.2 十进制 ==> 256进制
    vector<int> vec2;//存由256进制转化得的4个整数
    while(IP)
    {
        vec2.push_back(IP%256);
        IP/=256;
    } 

    // 输出
    printf("%lld\n",IP_d);
    printf("%d.%d.%d.%d",vec2[3],vec2[2],vec2[1],vec2[0]);
    
}

拓展:C/C++字符串变数字

stoi()字符串 --> int型
stoi()    字符串 --> long型
stoll() 字符串 --> long long型

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值