#include <iostream>
#include <vector>
using namespace std;
int ip_num(char c)
{
if(c>='0' && c<='9')
{
return c-'0';
}
else if(c>='A' && c<='F')
{
return c - 'A' + 10;
}
else if(c>='a' && c<='f')
{
return c - 'a' + 10;
}
return -1;
}
int is_ipv6(string ip, vector<int> &a)
{
int sum = 0;
int flag = 1;
int cnt = 0;
int compress = 0;
int compress_index = -1;
int num_len = 0;
for(int i=0; ip[i]; ++i)
{
char c = ip[i];
int num = ip_num(c);
if(num != -1)
{
sum = sum*16 + num;
if(sum>0xFFFF)
{
flag = 0;
break;
}
++num_len;
if(num_len > 4)
{
flag = 0;
break;
}
}
else if(c == ':')
{
char c2 = ip[i+1];
if(c2 == ':')
{
if(compress == 1)
{
flag = 0;
break;
}
compress = 1;
compress_index = cnt + 1;
}
if(c2 == '\0')
{
flag = 0;
break;
}
a.push_back(sum);
sum = 0;
num_len = 0;
++cnt;
if(cnt > 7)
{
flag = 0;
break;
}
}
else
{
flag = 0;
break;
}
}
if(flag == 1 && compress == 0 && cnt < 7)
{
flag = 0;
}
if(flag == 1)
{
a.push_back(sum);
int len = a.size();
for(int i=0; i<8-len; ++i)
a.push_back(0);
int j = 1;
for(int i=len; i>compress_index; --i)
{
a[8-j] = a[len-j];
a[len-j] = 0;
++j;
}
}
return flag;
}
int main()
{
vector<int> a;
string ip = "1:00002::3:0:9";
cout<<is_ipv6(ip,a)<<endl;
int len = a.size();
for(int i = 0; i<len; ++i)
{
cout<<a[i]<<" ";
}
return 0;
}
ipv6合法性判断
最新推荐文章于 2024-05-16 14:12:57 发布