C

csapp 연습문제 11.2

파피요트 2023. 3. 1. 01:31

문제

인자로 받은 16bit 16진수를 network byte order (big endian)으로 변환 후 출력하는 프로그램을 작성하라


해답 

다음과 같은 의문점이 든다. 

1. 책의 예시인 0x400를 입력받으면 출력이 1024가 아니라 4가 되어야 하는 것 아닌가 ? 

2. host의 byte order를 리틀 엔디안이라고 가정한 건가 ?

3. 왜 문제에서 요구하지 않은 dotted-decimal 스트링을 출력하는가? 


변경한 코드

            

#include "csapp.h"

int main(int argc, char **argv)
{
    printf("argc : %d\n",argc);        
    printf("argv[0] : %s\n",argv[0]);  
    printf("argv[1] : %s\n",argv[1]);  

                             //           Type              |            meaning  
    uint32_t addr;           //unsigned  int                |  Address in host byte order 
    struct in_addr inaddr;   //inaddr.s_addr (unsigned int) |  Address in network byte order
    char buf[MAXBUF];        //#define MAXBUF 8192          |  Buffer for dotted-decimal string 

    sscanf(argv[1], "%x", &addr);  //문자열을 32-bit 16진수로 인식하고 정수로 변환 후 &addr에 저장. 
                                   //16-bit hexadecimal value : %hx 
                                   //32 or 64-bit hexadecimal value : %x 
    printf("addr(host byte order) : %x\n",addr);  

    inaddr.s_addr = htonl(addr);   //network byte order로 변환 후 s_addr에 저장.
    				   //(htonl: host to network long)
                                   //(s_addr : short address)(uint32_t 타입)
    printf("addr(network byte order) : %x\n",inaddr.s_addr);  

    inet_ntop(AF_INET, &inaddr, buf, MAXBUF); //주소를 dotted-decimal로 변환 후 buf에 저장
   				     	      //(inet_ntop:network to presentation)					                                    
    printf("dotted-decimal notation : %s\n",buf);
    
    exit(0);

}

터미널 명령어, 출력

 

ubuntu@ip-172-31-6-22:~/project/test$ gcc hex2dd.c -o hex2dd
ubuntu@ip-172-31-6-22:~/project/test$ ./hex2dd 0x3F1404FF
argc : 2
argv[0] : ./hex2dd
argv[1] : 0x3F1404FF
addr(host byte order) : 3f1404ff
addr(network byte order) : ff04143f
dotted-decimal notation : 63.20.4.255

배운점 

 

ff04143f는 big endian, 다음과 같이 메모리에 저장된다. 

 

ff         low memory 

04

14

3f        high memory

 

이를 dotted-decimal notation으로 표시하면 63.20.4.255이므로 

dotted-decimal 표기법은 high memory에 있는 값부터 표시한다는 것을 알 수 있다.