function CanonicalizeIPAddress(const AIPAddress: String): String; var P: PAnsiChar; IPAddr: in_addr; {$IFDEF UNICODE} AnsiIPAddress: AnsiString; {$ENDIF} begin {$IFDEF UNICODE} {$WARN EXPLICIT_STRING_CAST_LOSS OFF} // W1060 AnsiIPAddress := AnsiString(AIPAddress); {$WARN EXPLICIT_STRING_CAST_LOSS DEFAULT} IPAddr.S_addr := inet_addr(PAnsiChar(AnsiIPAddress)); {$ELSE} IPAddr.S_addr := inet_addr(PAnsiChar(AIPAddress)); {$ENDIF} if IPAddr.S_addr = u_long(INADDR_NONE) then begin raise EConvertError.CreateFmt('Bad IP address: %s',[AIPAddress]); end; P := inet_ntoa(IPAddr); {$IFDEF UNICODE} SetString(AnsiIPAddress,P,StrLen(P)); Result := String(AnsiIPAddress); {$ELSE} SetString(Result,P,StrLen(P)); {$ENDIF} end;
入力がIPアドレスとして不適切(INADDR_NONE)だと例外が発生しますが、かといって全部が全部エラーになるわけではない(暗黙に0が埋められる場合とか)ところは要注意かな。
2008/08/25追記: コードサンプルをUnicode Readyなものに更新しました。
0 件のコメント:
コメントを投稿