네트워크와 CS

[컴퓨터구조] 진법 변환의 실무 활용 예시

Sophie소피 2023. 5. 10. 11:09

오늘 컴퓨터 구조를 공부하다가 문득 궁금한게 생겼다.

진법변환(이진법, 16진수)를 활용하여 실무에 활용하는 일이 있을까?! 이런의문..

웹개발자, 백엔드 개발자로 근무하면서 진법변환과 같은 지식들이 필요했던적이 없던걸로 기억한다.

초반에 개념적인 부분들이 많다보니까 중요도를 부여하는게 잘안되는것 같다..!

 

하지만 알아보니, 진법 변환같은 경우는 실무에선 거의 쓰이지 않지만

아주 low-level에서는 쓰이기도 한다고 한다.

network를 subnet을 나눌때도 사용하기도 한다.

 

컴퓨터는 결국 0과 1로 동작한다고 설명을 하지만 쉽게 얘기하면

결국 회로에 전기가 흐르냐/아니냐에 따라 1과 0으로 표시된다고 이해하면 될 것 같다.

 

컴퓨터 공학에서 진법 변환이란, 하나의 진법에서 다른 진법으로 수를 변환하는 과정을 말한다.

이진법과 16진법은 컴퓨터 공학에서 가장 많이 사용되는 진법이다.

하지만 초보자에게는 개념적인 부분이 많아 중요도를 인식하기 어려울 수 있다.

그래서 이번 글에서는 진법 변환의 실무에서의 활용 예시를 알아보도록 하자.

 

 

Network Subnetting

네트워크 관리자들은 서브넷(Subnet)을 사용하여 네트워크를 분할한다.

서브넷을 사용하여 네트워크를 분할하면 IP 주소를 효율적으로 할당하고,

보안을 강화할 수 있으며, 네트워크 구성을 간소화할 수 있다.

이를 위해서는 IP 주소 체계와 진법 변환 등의 지식이 필요하다.

 

네트워크 관리자들이 서브넷(Subnet)을 사용하여

네트워크를 분할하는 이유는 대표적으로 3가지이다.

  1. IP 주소 부족 문제 인터넷이나 로컬 네트워크에 접속하는 컴퓨터나 장비들은 IP 주소를 가지고 있어야 한다. 그러나 IP 주소의 수는 한정되어 있으며, IP 주소가 부족해지는 문제가 발생할 수 있다. 이를 해결하기 위해, 서브넷을 사용하여 IP 주소를 효율적으로 할당할 수 있다.
  2. 서브넷은 보안 강화에도 도움이 된다. 서브넷을 사용하면 같은 네트워크 상에서 여러 서브넷을 만들 수 있다. 이를 통해, 서로 다른 서브넷끼리 통신이 불가능하도록 설정할 수 있다. 이는 보안 상 이점을 가질 수 있다.
  3. 네트워크 구성 간소화 서브넷을 사용하면 네트워크 구성을 간소화할 수 있다. 예를 들어, 서브넷을 사용하지 않으면 같은 네트워크 상에서 동작하는 컴퓨터나 장비들은 모두 같은 IP 대역을 사용해야 한다. 이는 IP 주소를 효율적으로 사용하지 못하게 하며, 네트워크 구성이 복잡해지는 문제가 발생할 수 있다.

IP 주소는 32비트의 이진수로 표현되며,

서브넷 마스크(Subnet Mask)는 네트워크 ID를 정의하는 역할을 한다.

서브넷 마스크를 이용하여 서브넷을 나눌 때, 이진수 계산을 통해 빠르고 쉽게 구현할 수 있다.

예를 들어, IP 주소 192.168.1.1과 서브넷 마스크 255.255.255.0을 사용한다면,

이진수 변환을 통해 네트워크 ID는 192.168.1.0이 된다.

이를 기반으로 서브넷을 나누고, 호스트를 할당할 수 있다.

 

 

 

 

컴퓨터 아키텍처

컴퓨터는 전기적 신호를 이용하여 0과 1을 처리한다.

CPU는 연산을 수행하기 위해 레지스터(Register)를 사용한다.

레지스터는 비트(Bit) 단위로 값을 저장할 수 있는 저장소이다.

이진수와 16진수는 이러한 레지스터에서 사용되며, 프로그램을 작성할 때

이진수나 16진수로 값을 지정할 수 있다.

예를 들어, C언어에서 16진수를 사용하여 값을 초기화할 수 있다.

int num = 0x1F;   // num 변수에 16진수 1F(31)를 할당

 

 

보안

진법 변환은 보안 관련 분야에서도 활용된다.

예를 들어, 암호화된 데이터를 16진수로 표현하는 경우가 많기때문에

이는 암호화된 데이터가 16진수 형태로 표현될 때 더 안전하게 전송될 수 있다.

또한, 해시 함수(hash function)도 16진수를 사용하는 경우가 많다.

해시 함수는 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수이다.

이러한 해시 함수는 암호학적 용도나 데이터베이스에서 검색 용도로 사용된다.

 

예제) 문자열을 입력으로 받아서 djb2 알고리즘을 사용하여 해시 값을 계산

#include <stdio.h>
#include <string.h>
#include <stdint.h>

uint32_t djb2_hash(char* str)
{
    uint32_t hash = 5381;
    int c;

    while ((c = *str++))
        hash = ((hash << 5) + hash) + c; // hash * 33 + c

    return hash;
}

int main()
{
    char str[] = "hello world";
    uint32_t hash_val = djb2_hash(str);
    printf("Hash value of '%s' is %u", str, hash_val);

    return 0;
}

입력 문자열을 char* 타입으로 선언하고, while 루프에서는

입력 문자열의 끝을 나타내는 NULL 문자(0)가 나올 때까지

각 문자의 ASCII 코드 값을 해시 값에 누적시키는 방식으로 작성되었다.

출력은 printf 함수를 사용하여 문자열과 해시 값이 함께 출력되도록 한다.