https://cafe.naver.com/delmadang/2321
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 도 있으니 참고..
반응형
'삽질' 카테고리의 다른 글
delphi / php 에서 강제 파일 다운로드 (0) | 2025.01.25 |
---|---|
키움증권 해외파생 - OpenAPI(w) 자동로그인/계좌비번설정 자동화 (0) | 2024.02.26 |
delphi / TComboBox, TListBox onDrawItem (0) | 2023.08.15 |
NeuroTechonology FingerPrint SDK 13 이용기 (1) | 2023.06.01 |
delphi - cxGrid - row별 Column implement editior 설정. (0) | 2022.06.24 |