首页 > 其他分享 >IPv4地址转换成整数

IPv4地址转换成整数

时间:2025-01-16 20:30:18浏览次数:3  
标签:转换成 return invalid IP section 小节 整数 IPv4 ipSections

IPv4地址转换成整数

真题目录: 点击去查看

E 卷 100分题型

题目描述

存在一种虚拟[IPv4地址],由4小节组成,每节的范围为0~255,以#号间隔,虚拟IPv4地址可以转换为一个32位的整数,例如:

  • 128#0#255#255,转换为32位整数的结果为2147549183(0x8000FFFF)

  • 1#0#0#0,转换为32位整数的结果为16777216(0x01000000)

现以字符串形式给出一个虚拟IPv4地址,限制第1小节的范围为1128,即每一节范围分别为(1128)#(0255)#(0255)#(0~255),要求每个IPv4地址只能对应到唯一的整数上。如果是非法IPv4,返回invalid IP

输入描述

输入一行,虚拟IPv4地址格式字符串

输出描述

输出一行,按照要求输出整型或者特定字符

示例1

输入

100#101#1#5

输出

1684340997

示例2

输入

1#2#3

输出

invalid IP

题解

解题思路:

  1. 将输入字符串以#进行分割成一个字符串数组,如果数组长度不为0,代表不合法直接失效。
  2. 遍历检查数组中每个字符串是否合法(只包含数字并且不为空, 是否包含前导零),判断是否为合法IP。
  3. 接下来判断数组中的字符串代表的int数字大小是否符合范围就行。
  4. 进行求和计算,ip地址每一部分相当8位二进制,2^8 = 256

C++实现源码

#include <iostream>
#include <sstream>
#include <vector>

using namespace std;

// 判断字符串是否为数字
bool isNumeric(const string& str) {
    for (char c : str) {
        if (!isdigit(c)) {
            return false; // 如果有非数字字符则返回false
        }
    }
    return true; // 全部为数字则返回true
}

int main() {
    string input;
    getline(cin, input); // 获取输入的字符串

    // 将输入的字符串按照"#"分割成4个小节
    stringstream ss(input);
    vector<string> ipSections;
    string section;
    while (getline(ss, section, '#')) {
        ipSections.push_back(section);
    }

    if (ipSections.size() != 4) { // 如果分割后的小节数量不等于4,则说明输入的IPv4地址格式不正确
        cout << "invalid IP" << endl;
        return 0; // 结束程序
    }

    // 遍历每个部分进行检查
    for (const string& section : ipSections) {
        if (section.empty() || !isNumeric(section)) { // 检查是否为空或者是否每部分都是数字
            cout << "invalid IP" << endl;
            return 0; // 结束程序
        }

        // 检查前导零的情况
        if (section.length() > 1 && section[0] == '0') {
            cout << "invalid IP" << endl;
            return 0; // 结束程序
        }
    }

    // 检查第一个小节的大小范围 
    int firstSection = stoi(ipSections[0]); // 将第一个小节转换为整数
    if (firstSection < 1 || firstSection > 128) { // 如果第一个小节的值不在1~128的范围内
        cout << "invalid IP" << endl;
        return 0; // 结束程序
    }

    // 检查其余3个小节的范围
    for (int i = 1; i < 4; i++) {
        int sectionValue = stoi(ipSections[i]); // 将当前小节转换为整数
        if (sectionValue < 0 || sectionValue > 255) { // 如果不在0~255范围内
            cout << "invalid IP" << endl;
            return 0; // 结束程序
        }
    }

    // 计算最终的32位整数
    long ipValue = 0;
    for (int i = 0; i < 4; i++) {
        // 也可以使用位运算,计算效率更高 
        //ipValue = ipValue << 8 + stoi(ipSections[i]);
        ipValue = ipValue * 256 + stoi(ipSections[i]); // 每个小节对应一个字节,计算最终的整数值
    }

    cout << ipValue << endl; // 输出最终的32位整数
    return 0;
}

JAVA源码实现

import java.util.*;

public class Main {

    // 判断字符串是否为数字
    private static boolean isNumeric(String str) {
        for (char c : str.toCharArray()) {
            if (!Character.isDigit(c)) {
                return false; // 如果有非数字字符则返回 false
            }
        }
        return true; // 全部为数字则返回 true
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine(); // 获取输入的字符串
        scanner.close();

        // 将输入的字符串按照 "#" 分割成 4 个小节
        String[] ipSections = input.split("#");

        if (ipSections.length != 4) { // 如果分割后的小节数量不等于 4,则说明输入的 IPv4 地址格式不正确
            System.out.println("invalid IP");
            return; // 结束程序
        }

        // 遍历每个部分进行检查
        for (String section : ipSections) {
            if (section.isEmpty() || !isNumeric(section)) { // 检查是否为空或者是否每部分都是数字
                System.out.println("invalid IP");
                return; // 结束程序
            }

            // 检查前导零的情况
            if (section.length() > 1 && section.charAt(0) == '0') {
                System.out.println("invalid IP");
                return; // 结束程序
            }
        }

        // 检查第一个小节的大小范围 
        int firstSection = Integer.parseInt(ipSections[0]); // 将第一个小节转换为整数
        if (firstSection < 1 || firstSection > 128) { // 如果第一个小节的值不在 1~128 的范围内
            System.out.println("invalid IP");
            return; // 结束程序
        }

        // 检查其余 3 个小节的范围
        for (int i = 1; i < 4; i++) {
            int sectionValue = Integer.parseInt(ipSections[i]); // 将当前小节转换为整数
            if (sectionValue < 0 || sectionValue > 255) { // 如果不在 0~255 范围内
                System.out.println("invalid IP");
                return; // 结束程序
            }
        }

        // 计算最终的 32 位整数
        long ipValue = 0;
        for (int i = 0; i < 4; i++) {
            ipValue = ipValue * 256 + Integer.parseInt(ipSections[i]); // 每个小节对应一个字节,计算最终的整数值
        }

        System.out.println(ipValue); // 输出最终的 32 位整数
    }
}

Python实现源码

# def is_numeric(string):
#     """判断字符串是否为数字"""
#     return string.isdigit()

def main():
    # 获取输入的字符串
    input_str = input().strip()

    # 将输入的字符串按照"#"分割成4个小节
    ip_sections = input_str.split('#')

    if len(ip_sections) != 4:  # 如果分割后的小节数量不等于4,则说明输入的IPv4地址格式不正确
        print("invalid IP")
        return

    # 遍历每个部分进行检查
    for section in ip_sections:
        if not section or not section.isdigit():  # 检查是否为空或者是否每部分都是数字
            print("invalid IP")
            return

        # 检查前导零的情况
        if len(section) > 1 and section[0] == '0':
            print("invalid IP")
            return

    # 检查第一个小节的大小范围 
    first_section = int(ip_sections[0])  # 将第一个小节转换为整数
    if first_section < 1 or first_section > 128:  # 如果第一个小节的值不在1~128的范围内
        print("invalid IP")
        return

    # 检查其余3个小节的范围
    for section in ip_sections[1:]:
        section_value = int(section)  # 将当前小节转换为整数
        if section_value < 0 or section_value > 255:  # 如果不在0~255范围内
            print("invalid IP")
            return

    # 计算最终的32位整数
    ip_value = 0
    for section in ip_sections:
        ip_value = ip_value * 256 + int(section)  # 每个小节对应一个字节,计算最终的整数值

    print(ip_value)  # 输出最终的32位整数

if __name__ == "__main__":
    main()

Go实现源码

package main

import (
	"fmt"
	"strconv"
	"strings"
)

// isNumeric 判断字符串是否为数字
func isNumeric(str string) bool {
	for _, c := range str {
		if c < '0' || c > '9' {
			return false
		}
	}
	return true
}

func main() {
	// 获取输入的字符串
	var input string
	fmt.Scanln(&input)
	input = strings.TrimSpace(input)

	// 将输入的字符串按照"#"分割成4个小节
	ipSections := strings.Split(input, "#")

	if len(ipSections) != 4 { // 如果分割后的小节数量不等于4,则说明输入的IPv4地址格式不正确
		fmt.Println("invalid IP")
		return
	}

	// 遍历每个部分进行检查
	for _, section := range ipSections {
		if section == "" || !isNumeric(section) { // 检查是否为空或者是否每部分都是数字
			fmt.Println("invalid IP")
			return
		}

		// 检查前导零的情况
		if len(section) > 1 && section[0] == '0' {
			fmt.Println("invalid IP")
			return
		}
	}

	// 检查第一个小节的大小范围
	firstSection, err := strconv.Atoi(ipSections[0]) // 将第一个小节转换为整数
	if err != nil || firstSection < 1 || firstSection > 128 { // 如果第一个小节的值不在1~128的范围内
		fmt.Println("invalid IP")
		return
	}

	// 检查其余3个小节的范围
	for _, section := range ipSections[1:] {
		sectionValue, err := strconv.Atoi(section) // 将当前小节转换为整数
		if err != nil || sectionValue < 0 || sectionValue > 255 { // 如果不在0~255范围内
			fmt.Println("invalid IP")
			return
		}
	}

	// 计算最终的32位整数
	ipValue := 0
	for _, section := range ipSections {
		sectionValue, _ := strconv.Atoi(section)
		ipValue = ipValue*256 + sectionValue // 每个小节对应一个字节,计算最终的整数值
	}

	fmt.Println(ipValue) // 输出最终的32位整数
}

标签:转换成,return,invalid,IP,section,小节,整数,IPv4,ipSections
From: https://blog.csdn.net/qq_45776114/article/details/145186457

相关文章

  • 数学建模学习-整数规划(Integer Programming)教程(3)
    数学建模学习-整数规划(IntegerProgramming)教程(3)写在最前注意本文的相关代码及例子为同学们提供参考,借鉴相关结构,在这里举一些通俗易懂的例子,方便同学们根据实际情况修改代码,很多同学私信反映能否添加一些可视化,这里每篇教程都尽可能增加一些可视化方便同学理解,但具体......
  • C语言代码题:有评委对选手进行打分,分数为整数,接收数据为-1的时候结束,去掉一个最高分,去
    思路:    1、定义数组进行接收分数    2、用循环求最高分,最低分,总值    3、求平均分,输出#include<stdio.h>intmain(void){inti=0,val=0;inta[100]={0};doublemin=0,max=0,num=0,avg=0;//给数组赋值......
  • 2025-01-15:执行操作可获得的最大总奖励 Ⅰ。用go语言,给定一个整数数组 rewardValues,其
    2025-01-15:执行操作可获得的最大总奖励Ⅰ。用go语言,给定一个整数数组rewardValues,其中包含n个代表奖励值的数字。你开始时的总奖励x为0,并且所有下标都是未标记状态。你可以进行以下操作若干次:1.从索引范围[0,n-1]中选择一个未标记的下标i。2.如果rewardValues[i]......
  • IPv4与IPv6有什么优缺点?
    IP是指互联网协议,是传输控制协议/互联网协议套件(TCP/IP)的主要部分。TCP/IP是一套标准和规则,用于规范不同网络上的设备之间打包数据(数据报)的传输和交换。互联网协议管理跨网络边界的数据包寻址、打包/解包和路由效率。要参与数据交换,每个内联网或互联网设备都需要一个唯一的......
  • pdf怎么转换成word?记住这个网站 就可以免费在线转换PDF文件
    pdf怎么转换成word?记住这个网站就可以免费在线转换PDF文件。PDF(PortableDocumentFormat)文件因其跨平台兼容性和保持文档原貌的特性而被广泛使用。然而,在需要编辑文档内容时,将其转换为Word格式则显得尤为重要。以下介绍几种将PDF转换成Word的简易方法。第一种:选择使用专业......
  • 求解整数二进制中1的个数:func(9999)实现解析
    @TOC问题描述给定一个函数func(x),其目的是计算整数x的二进制表示中1的个数。函数的实现通过不断清除x的最低位的1,直到x变为0,并计数执行了多少次这样的操作。假设x=9999,我们需要找出func(9999)的返回值。思路二进制转换:将x转换为二进制数。计数1......
  • AccessData FTK Imager 是一款由 AccessData 公司开发的数字取证工具,用于创建计算机系
    AccessDataFTKImager是一款由AccessData公司开发的数字取证工具,用于创建计算机系统和存储设备的完整数据镜像,并且支持从中提取和分析数据。它是一款非常流行的取证软件,尤其在计算机取证、数据恢复和法律领域应用广泛。FTKImager的主要功能:创建数据镜像:FTKImager可以......
  • 整数序列的元素最大跨度值题解
    【题目要求】计算序列的最大跨度值(最大值-最小值)一、求最大值如果a大于最大值,那么最大值就变成a,开始最大值要等于0。二、求最小值如果a小于最小值,那么最小值就变成a,开始最小值要等于1000。【题解代码】include<bits/stdc++.h>usingnamespacestd;intmain(){intn,a,......
  • json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办?
    在使用Python的json模块进行序列化时,默认情况下会将中文转换为Unicode编码。如果你希望在序列化时保留中文,可以通过设置ensure_ascii=False来实现。以下是示例代码:importjsondata={"name":"李浩瑞","age":30}#默认行为(中文会被转换成Unicode)json_def......
  • 一个开源的 React 组件,能快速将 markdown 文档转换成社交媒体海报图片,自媒体必用(带私
    如果你是一个喜欢通过社交媒体分享内容的人,或许你会遇到这样的需求:如何将文本、博客文章、或是Markdown格式的内容转化为更具视觉吸引力的海报,方便分享给朋友或发布在社交平台上?今天,我给大家介绍一个非常便捷的开源项目——Markdown-to-Poster,它将帮助你轻松将Markdown内容......