XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXXの
非省略形式にて変換するプログラムを教えてください。言語はC/C++/Java/JavaScriptが希望ですが、他のものでもかまいません。
※IPv4互換形式は無視していただいて結構です。
http://docs.hp.com/ja/B2355-90828/ch02s02.html
strにフィールド省略形式のIPv6を入れると
strに非省略形式で入ります
サンプルもつけたのでごらん下さい
int field[8],i,j,p,error=0,ryaku=-1,ryaku2=0,ryakuend=0;
/*初期化*/
for(i=0;i<8;i++)field[i]=0;
for(i=p=0;i<8&&str[p];p++){
if(str[p]==’:’){
/*省略部分の処理*/
if(str[p+1]==’:’){
ryaku2++;
if(ryaku==-1)ryaku=i+(p>0?1:0);
/*省略部分は1箇所にまとまって無くてはいけない*/
if(ryakuend==2)error|=2;
ryakuend=1;
}
else if(ryakuend==1)ryakuend=2;
i++;
}
/*16進数の処理*/
else if(str[p]<=’9’&&str[p]>=’0’){
field[i]=field[i]*16+str[p]-’0’;
if(field[i]>0xffff)error|=8;
}
else if((str[p]|’ ’)<=’f’&&(str[p]|’ ’)>=’a’){
field[i]=field[i]*16+(str[p]|’ ’)-’a’+10;
if(field[i]>0xffff)error|=8;
}
/*不正な文字*/
else if((unsigned char)str[p]>0x20){
error|=1;
}
}
/*省略の修復*/
if(ryaku!=-1){
ryaku2=8-i;
if(ryaku2>1)for(j=0;j<8-(ryaku+ryaku2);j++){
field[7-j]=field[8-j-ryaku2];
}
for(j=0;j<ryaku2;j++){
field[ryaku+j]=0;
}
}
if(i<7&&ryaku2==0)error|=4;
/*変換処理*/
wsprintf(str,”%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x”,field[0],field[1],field[2],field[3],field[4],field[5],field[6],field[7]);
ばっちりです!ありがとうございます!