当前位置:我的异常网» C语言 » ipv6地址处置
ipv6地址处置(2)
www.myexceptions.net 网友分享于:2014-01-17 浏览:37次
#include
char ipv60[]="2001:0DB8:0000:0000:0000:0000:1428:0000";
char ipv61[]="1040::1";
char ipv62[]="fe80::20c:29ff:fe6b:2516";
char ipv63[]="::ffff:c0a8:5909";
unsigned char ip_v6[16];
void show(char *a) {
int i;
printf("%-39s=>",a);
for (i=0;i<16;i++) printf("%02x ",ip_v6[i]);
printf("\n");
}
void inet_addr6(char *a) {
char *p;
int n,i,r,k,j;
short s;
k=0;
p=a;
while (1) {
if (*p==':') k++;
p++;
if (*p==0) break;
}
if (a[0]==':') k--;
i=0;
p=a;
while (1) {
r=sscanf(p,"%hx%n",&s,&n);
if (1==r) {
ip_v6[i]=*((unsigned char *)&s+1);
ip_v6[i+1]=*((unsigned char *)(&s));
i+=2;
if (i>=16) break;
p+=n;
} else if (0==r) {
if (p[0]==':') {
if (p[1]==':') {
for (j=0;j
i+=(8-k)*2;
if (i>=16) break;
p+=2;
} else {
p++;
}
} else {
printf("Format Error [%s]!\n",a);
}
} else break;
}
}
int main() {
inet_addr6(ipv60);show(ipv60);
inet_addr6(ipv61);show(ipv61);
inet_addr6(ipv62);show(ipv62);
inet_addr6(ipv63);show(ipv63);
return 0;
}
//2001:0DB8:0000:0000:0000:0000:1428:0000=>20 01 0d b8 00 00 00 00 00 00 00 00 14 28 00 00
//1040::1 =>10 40 00 00 00 00 00 00 00 00 00 00 00 00 00 01
//fe80::20c:29ff:fe6b:2516 =>fe 80 00 00 00 00 00 00 02 0c 29 ff fe 6b 25 16
//::ffff:c0a8:5909 =>00 00 00 00 00 00 00 00 00 00 ff ff c0 a8 59 09
//
文章评论