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 件のコメント:
コメントを投稿