21xrx.com
2025-03-27 06:00:53 Thursday
文章检索 我的文章 写文章
C++实现IP地址的合法性判断及16进制支持
2023-07-04 21:15:44 深夜i     11     0
C++ IP地址 合法性判断 16进制支持

随着互联网技术的发展和普及,IP地址已经成为人们日常工作和学习中不可或缺的一部分。而对于程序开发者来说,判断IP地址的合法性和支持16进制表示已经成为非常常见和重要的任务。在C++中,我们可以通过一些简单的逻辑和代码实现这些功能,下面就让我们一起来了解一下吧。

首先,我们需要明确IP地址的合法性标准。在IPv4中,IP地址由四个十进制数组成,每个数的范围在0-255之间,且由分号“.”隔开。而在IPv6中,则采用八组十六进制数表示,每组由四个字符组成,由冒号“:”隔开。对此,我们可以分别使用两个函数来判断:

bool isIPv4Address(string address) {
  int num = 0;
  int dotCount = 0;
  int len = address.size();
  for (int i = 0; i < len; i++) {
    if (address[i] == '.') {
      dotCount++;
      if (num < 0 || num > 255)
        return false;
      
      num = 0;
      continue;
    }
    if (address[i] < '0' || address[i] > '9')
      return false;
    
    num = num * 10 + (address[i] - '0');
  }
  if (num < 0 || num > 255 || dotCount != 3)
    return false;
  
  return true;
}
bool isIPv6Address(string address) {
  int colonCount = 0;
  int len = address.size();
  for (int i = 0; i < len; i++) {
    if (address[i] == ':') {
      colonCount++;
      continue;
    }
    if (isdigit(address[i]) || (address[i] >= 'a' && address[i] <= 'f') || (address[i] >= 'A' && address[i] <= 'F'))
      continue;
    
    return false;
  }
  if (colonCount != 7)
    return false;
  
  return true;
}

以上两个函数分别用来判断IPv4和IPv6地址的合法性。其中,isIPv4Address()函数中的逻辑比较简单,直接对每个数字进行判断,是否在合法范围内且为4个点分开。而isIPv6Address()函数中,则需要考虑到十六进制的表示和大小写字母的问题。

除此之外,还有一个需求是支持16进制表示。因为在某些场景下,用户可能会使用16进制来表示IP地址,这时候我们需要将其转换为10进制再进行判断。那么我们可以进行如下实现:

unsigned int hexToDec(string str) {
  unsigned int sum = 0;
  for (int i = 0; i < str.size(); i++) {
    char c = str[i];
    if (isdigit(c)) {
      sum = sum * 16 + (c - '0');
    } else {
      sum = sum * 16 + (tolower(c) - 'a' + 10);
    }
  }
  return sum;
}

这个函数简单明了,对于每一个字符进行转换后,再将其乘上16的对应次幂即可。由此,我们可以很方便地实现对16进制IP地址的支持。

总之,对于C++程序开发者来说,判断IP地址的合法性和支持16进制表示已经成为程序开发过程中不可或缺的一部分,而通过以上的函数实现,我们可以轻松地完成这一任务。

  
  

评论区

    相似文章