본문 바로가기
삽질

delphi / ip 문자열 <-> 숫자

by rokwha 2025. 1. 21.

https://cafe.naver.com/delmadang/2321

 

[팁] 아이피주소 를 정수로

알아두면 쓸데없는 팁. 아이피주소 (IPv4) 를 정수 ( UInt32 ) 로 상호변환 하는 예제 입니다. UInt32 가 없으면 Cardinal로 하면 됩니다. 부호없는 ...

cafe.naver.com

 

ip 문자열 ( 1.1.1.1) 을 숫자( ulong ) 로 숫자를 문자열로 상호 변환 하는 예제 코드..

function ThIP.IP2Long(AIpAddress: string): UInt32;
//아이피주소(IPv4) 문자열을 정수(UInt32)로
  var
    slIPs: TStrings;
    aTemp: Array[0..3] of integer;
    nI: integer;
begin
  slIPs:= TStringList.Create;
  slIPs.Delimiter:= '.';
  slIPs.DelimitedText:= AIpAddress;
  FillChar(aTemp, 4, #0);
  Result:= 0;
  try
    for nI:= 0 to 3 do
    begin
      aTemp[nI]:= StrToInt(slIPs.Strings[nI]);
      //aTemp[nI]:= Round((aTemp[nI] * math.Power( 256, 3-nI)));
      //Result:= Result+ aTemp[nI];
      Result:= (Result shl 8) or aTemp[nI];
    end;
  finally
    FreeAndNil(slIPs);
  end;
end;

function ThIP.Long2IP(AIpLong: UInt32): string;
//정수를 아이피주소로.
  var
    aTemp: Array[0..3] of Byte;
    nI: integer;
begin
  FillChar(aTemp, 4, 0);
  aTemp[0]:= AIpLong shr 24 and $FF;
  aTemp[1]:= AIpLong shr 16 and $FF;
  aTemp[2]:= AIpLong shr 8  and $FF;
  aTemp[3]:= AIpLong and $FF;
  Result:= Format('%d.%d.%d.%d', [aTemp[0],aTemp[1], aTemp[2], aTemp[3]]);

  {
  for nI:= 0 to 3 do
  begin
    aTemp[nI]:= Trunc( Trunc( AIpLong / math.Power(256, 3-nI)) mod 256);
    Result:= Format('%d.%d.%d.%d', [aTemp[0],aTemp[1], aTemp[2], aTemp[3]]);
  end;
  }
end;

 

비트연산 으로 되어 있지만 주석부분으로 계산해볼수도 있다.. ( round 보다는 trunc 가 나을듯...)

윈도우API 에도 있으니 참고 해보자. inet_addr, inet_ntoa 단 이 경우 바이트 오더 의 문제가 있으니 htonl, ntohl 로 바꿔줘야 한다. 

winsock.pas 나 winsock2.pas 에 해당 함수군들이 있으니 uses 절에 추가하고... 

procedure TForm1.Button3Click(Sender: TObject);
  var
    sIP: string;
    nIP: UInt32;
begin
  sIP:= '192.168.0.1'; // 127.1 과 같은거는 127.0.0.1 로...인식됨
  nIP:= winSock2.inet_addr( PAnsiChar(sIP) ); //nIP=16820416
  nIP:= winsock2.htonl( nIP ); //nIP=3232235521
end;

procedure TForm1.Button4Click(Sender: TObject);
  var
    aIP: in_addr;
    sIP: string;
begin
  aIP.S_addr:= 3232235521;
  aIP.S_addr:= winsock2.ntohl( aIP.S_addr )
  sIP:= winsock2.inet_ntoa( aIP );
  //sIP = '192.168.0.1';
end;


예외처리 같은건 뭐 알아서 잘...

ipv6 도 지원되는 InetNtop, InetPton 도 있으니 참고..

반응형