[통신] LSB, MSB 정의 및 2바이트 16진수 변환 방법
1. 왜 통신에선 8진수를 안쓰고 16진수만 쓰는가?
- 8진법을 컴퓨터 분야에서 쓰는 이유는 8진수 자릿수 하나가 23을 표현할 수 있어서 2진수를 직관적으로 빠르게 변환 가능하고, 16진수에 비해 사람이 계산하기 간편하기 때문이다. 이는 프로그래밍할 때 사람이 비트까지 고려해야 했던 초창기 컴퓨터에선 긴요했다. 다만 8진법의 자릿수 하나가 1바이트(8비트, 0000 0000)에 정확히 대응하지 않기에 이후 표현법을 16진법에 물려주게 된다.
- 요즘은 컴퓨터공학과의 교육과정 외엔 거의 안 쓰인다.
- 오직 UNIX의 파일 액세스 권한 설정에서만 8진법으로 표기한다. 유닉스의 파일 액세스 권한은 소유자, 그룹, 외부인 각각에 대해 읽기, 쓰기, 실행 권한을 지정할 수 있는데 읽기, 쓰기, 실행 권한 3비트를 8진수 하나로 묶어서 표기한다. 예를 들어 권한 751은 rwxr-x--x 를 뜻하는데 파일 소유자는 읽기, 쓰기, 실행 권한 모두를 갖고 파일의 그룹 구성원에겐 읽기와 실행, 그 외의 사용자에겐 실행 권한만을 준다는 의미이다.
2. LSB / MSB 정의
한줄 요약
- MSB(Most Significant Bit) : 제일 큰 수 (또는 부호 :: 양수(+)면 0, 음수(-)면 1)
- LSB(Least Significant Bit) : 제일 작은 수
1) LSB
- LSB는 Least Significant Bit의 약자로서 하나의 데이터 형에서의 가장 낮은 위치의 Bit를 의미합니다. 이 예를 들어서 signed char 데이터 형과 unsigned char 데이터 형에 대해서 예를 들면 아래와 같습니다.
- 일단 LSB의 위치는 가장 값이 작은 비트인 2^0에 위치하고 있는 것을 알 수 있습니다. 이 LSB의 값을 이용하여 해당 데이터 형에 들어있는 실제 숫자가 짝수인지 홀수인지 손쉽게 알아낼 수 있습니다. 이는 2진수 시스템에서는 당연한 이치라고 할 수 있겠죠?
- 한편 이런 LSB는 프로그래밍 시 주로 난수발생 함수, 해시 함수, 검사합(Checksum) 함수 등에서 많이 쓰이고 있습니다. 왜냐하면 LSB는 값이 조금이라도 변경된다면, 데이터 형의 최하위 비트이므로 그 값이 거의 100% 변화가 발생하기 때문이죠.
- 다음은 Signed Char 데이터 형에서의 LSB에 대해서 살펴보도록 하겠습니다. Signed Char 데이터형의 LSB 역시 Unsigned Char 데이터형에서의 LSB와 큰 차이가 없습니다. 즉, LSB는 데이터형의 가장 최하위 비트값이라고 보면 됩니다.
2) MSB
- MSB는 Most Significant Bit의 약자로 어떠한 데이터 형의 최상위 비트를 의미합니다. 이 MSB는 데이터 형에 따라서 특징이 조금 나뉘게 되는데, 우선 위에서 소개했던 unsigned char 데이터 형의 MSB에 대해서 살펴보겠습니다.
- unsigned char 데이터 형에서의 MSB는 2^7이라는 값을 지니고 있는 위치의 비트라고 할 수 있겠습니다. 그 외에는 unsigned char 데이터 형의 가장 값이 큰 위치의 최상위 비트 정도로 정의를 내릴 수 있겠습니다.
- 다음은 가장 중요하게 살펴봐야할 signed char 데이터 형에서의 MSB입니다. 위에 소개했던 signed char 데이터 형의 MSB를 살펴보면 MSB 위치가 부호자리를 나타내고 있는 것을 알 수 있습니다. 따라서 해당 데이터 형의 값이 MSB만 확인하면, 양수인지 혹은 음수인지를 손쉽게 알아낼 수 있습니다.
- 따라서 signed char 데이터 형에서의 MSB에 대해 정의를 내리자면, 가장 최상위의 부호값 비트라고 할 수 있겠습니다. 아래 그림을 예시로 보면 이해가 잘 될 듯 합니다.
ex1) 부호없는 경우(unsigned) : MSB는 데이터가 됨
ex2) 부호있는 경우(signed) : MSB는 부호가 됨
- 양수(+) : 0, 음수(-) : 1
3. 데이터의 8진수, 16진수 변환 방법
1) 8진수 변환
- 현재 통신 프로토콜에서 사용 X (상식으로 알고 있기)
- 데이터 앞에 0을 붙여 표기 (예: 075, 0653 등)
※ 8진수 변환 방법
Step 1. 10진수 → 2진수 변환
Step 2. 3자리씩 끊기
Step 3. 3자리씩 읽어 8진수로 변환
ex) 93을 8진수 변환하기
step 1. 93 (10진수) → 0101 1101 (2진수)
step 2. 001 011 101
step 3. 1 3 5 → 0135 (8진수)
2) 16진수 변환
- UDP/TCP 등 통신에서 보편적으로 사용하는 데이터 처리 방식
- 데이터 앞에 0x를 붙여 표기 (예: 0x7A, 0x8DA9 등)
- 1바이트 : 2자리 / 2바이트: 4자리 / 3바이트: 6자리 ... 표기
※ 16진수 변환 방법
Step 1. 10진수 → 2진수 변환
Step 2. 4자리씩 끊기
Step 3. 4자리씩 읽어 16진수로 변환
<16진수 변환표>
10진수 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16진수 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
ex) 93을 16진수 변환하기
step 1. 93 (10진수) → 0101 1101 (2진수)
step 2. 0101 1101
step 3. 5 D → 0x5D(16진수)
3) 음수 변환 (8진수/16진수)
※ 음수 변환 방법
Step 1. I-xI (절대값)의 10진수 → 2진수 변환
Step 2. 0→1, 1→0 값 리버스 (2의 보수라고 부름)
Step 3. 결과값 +1
Step 4. 3자리(8진수) / 4자리(16진수)씩 끊기
Step 5. 3자리 / 4자리씩 읽어 8진수 / 16진수로 변환
ex) -88을 8진수/16진수로 변환하기
Step 1. 88 (10진수) → 0101 1000
Step 2. 0101 1000 → 1010 0111
Step 3. 1010 1000
Step 4. (3자리) 010 101 000
(4자리) 1010 1000
Step 5. (8진수) 2 5 0 → 0250 (8진수)
(16진수) A 8 → 0xA8 (16진수)
4. 실제 통신에서는 데이터를 어떻게 보낼까?
- TCP, UDP 통신 등에서 데이터 송수신시 ICD(Interface Control Document)에서 정의한 통신규약대로 데이터를 2진수로 주고받고, Input/Output 값은 16진수로 확인 가능하다.
- 예를들어 실제 현업에서 사용하는 데이터 I/O ICD는 아래와 같은 형식을 따른다.
위 ICD를 설명하자면,
① 하나의 변수당 할당하는 데이터 크기는 16비트(2바이트)이다.
② MSB가 각각 256(2^8), 64(2^6)라는 것은 부호가 없다는 뜻이다.
(부호가 있으면 MSB는 0(+) 또는 1(-)이 된다.)
③ 1~9비트까지는 과일의 ID 데이터를 보낸다. (총 9자리)
④ 10~16비트까지는 과일의 수량 데이터를 보낸다. (총 7자리)
예를 들어 과일가게에서 멜론 1개를 팔게되었다고 가정하여
따라서 아래의 데이터 송수신 표를 참고해서 설명하면,
① 포스기(Client)에 멜론 1개를 입력하면 16진수 형태로 Output 데이터 0x3081가 생성된다.
② 포스기(Client) → 서버로 Output 데이터를 2Byte의 2진수 0011 0000 1000 0001 형태로 보낸다.
③ 정상적으로 송신이 완료되면, 서버에서는 16진수 형태로 Input 데이터 0x3081를 받아 연산 및 처리한다.
'IT > IT 상식' 카테고리의 다른 글
[IT] R프로그래밍 및 R Studio 설치하기 (0) | 2022.08.14 |
---|---|
사용쉬운 매크로 프로그램 키매크로(key macro) 다운 및 사용법 (0) | 2022.08.12 |
[통신] IP 주소 IPv4 vs. IPv6 차이 (0) | 2022.06.03 |
[IT상식] visual studio 2019 다운로드 / 제품키 (1) | 2022.05.23 |
[IT 상식] 특정 시간에 컴퓨터 실행 / 종료 / 재부팅 타이머 만들기 (0) | 2022.02.24 |