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
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에 있는 값부터 표시한다는 것을 알 수 있다.