2008年7月16日

IP(v4)アドレスの正規形表現への変換

入力されたIP(v4)アドレスを正規形の表現に変換する方法はいくらでもありそうですが、手抜きでWinSockのinet_addrinet_ntoaを使用して文字列→IPアドレス→文字列とするやり方を。
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 件のコメント: