IP 주소 값을 입력으로 받아 해당 IP 주소를 16진수(hexadecimal) 형태로 변환하여 표현하는 것이 이 프로그램의 목표입니다.
IP 주소란 무엇인가?
IP 주소(Internet Protocol Address)는 네트워크에 연결된 하드웨어를 고유하게 식별하는 고유한 번호입니다. '인터넷(Internet)'은 네트워크를 의미하고, '프로토콜(Protocol)'은 연결을 위해 반드시 준수해야 하는 규칙과 규정의 집합을 정의합니다. 바로 IP 주소가 있기 때문에 시스템 간에 네트워크를 통한 통신이 가능해집니다.
IP에는 두 가지 버전이 존재합니다.
- IPv4 (Internet Protocol Version 4)
- IPv6 (Internet Protocol Version 6)
IP 주소는 일반적으로 다음과 같은 숫자 나열의 형태로 표현됩니다.
151.101.65.121
이번 변환 작업에서는 인터넷 관련 연산을 위해 만들어진 헤더 파일인 arpa/inet.h를 사용합니다. 이 헤더 파일에 포함된 inet_addr() 함수는 점(.)으로 구분된 10진수 형태의 IP 주소 문자열을 32비트 정수 값으로 변환해 줍니다.
입력 및 출력 예시
입력: 127.0.0.1
출력: 0x7f000001
입력: 172.31.0.2
출력: 0xac1f0002
알고리즘
시작
Step 1 -> 문자열 뒤집기 함수 선언
void reverse(char* str)
int len = 2 로 설정
int r = strlen(str) - 2 로 설정
While (len < r) 반복
swap(str[len++], str[r++]) 호출
swap(str[len++], str[r]) 호출
r = r - 3 설정
반복 종료
함수 종료
Step 2 -> IP 주소를 16진수로 변환하는 함수 선언
void convert(int ip_add)
char str[15] 선언
sprintf(str, "0x%08x", ip_add) 호출
reverse(str) 호출
str 출력
Step 3 -> main() 함수에서
int ip_add = inet_addr("127.0.0.1") 선언
convert(ip_add) 호출
종료
C++ 구현 코드
#include <arpa/inet.h>
#include <iostream>
#include <string.h>
using namespace std;
// 16진수 문자열을 뒤집는 함수
void reverse(char* str) {
int len = 2;
int r = strlen(str) - 2;
while (len < r) {
swap(str[len++], str[r++]);
swap(str[len++], str[r]);
r = r - 3;
}
}
// IP 주소를 16진수로 변환하는 함수
void convert(int ip_add) {
char str[15];
sprintf(str, "0x%08x", ip_add);
reverse(str);
cout << str << "\n";
}
int main() {
int ip_add = inet_addr("127.0.0.1");
convert(ip_add);
return 0;
}
코드 설명
위 코드의 동작 원리를 단계별로 살펴보겠습니다.
- inet_addr() 함수: 점 표기법(dotted-decimal)의 IP 주소 문자열을 네트워크 바이트 순서(network byte order)의 32비트 정수로 변환합니다. 예를 들어 "127.0.0.1"은 0x7f000001과 같은 정수 값으로 변환되지만, 리틀 엔디안(little-endian) 시스템에서는 바이트 순서가 반대로 저장됩니다.
- sprintf() 함수:
%08x포맷 지정자를 사용해 정수 값을 8자리 16진수 문자열로 변환하며, 앞에 "0x" 접두사를 붙입니다. - reverse() 함수: 리틀 엔디안 시스템에서 저장된 바이트 순서를 사람이 읽기 쉬운 형태로 맞추기 위해 "0x" 접두사를 제외한 나머지 부분의 바이트 순서를 뒤집습니다. len이 2부터 시작하는 이유는 "0x" 두 글자를 건너뛰기 위해서입니다.
실행 결과
위 코드를 실행하면 다음과 같은 출력 결과가 생성됩니다.
0x7f000001
즉, 입력으로 받은 IP 주소 "127.0.0.1"이 16진수 표현인 0x7f000001로 성공적으로 변환된 것을 확인할 수 있습니다. 여기서 7f는 10진수 127, 00은 0, 01은 1에 해당하며, 각 옥텟(octet)이 16진수 두 자리씩 대응되는 것을 알 수 있습니다.