ゼロは省略、フィールド省略にて記述されたIPv6のアドレスを

XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXXの
非省略形式にて変換するプログラムを教えてください。言語はC/C++/Java/JavaScriptが希望ですが、他のものでもかまいません。
※IPv4互換形式は無視していただいて結構です。
http://docs.hp.com/ja/B2355-90828/ch02s02.html

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/01/21 11:14:45
  • 終了:--

回答(1件)

id:aki73ix No.1

aki73ix回答回数5224ベストアンサー獲得回数272005/01/21 13:05:59

ポイント100pt

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]);

id:peugeot

ばっちりです!ありがとうございます!

2005/01/21 13:36:43

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません