티스토리 뷰
리눅스의 mkdir 명령어를 mkdir 함수를 이용해 구현하기 위해,
함수의 파라미터 중 permission을 의미하는 mode 값을 char*형에서 8진수로 만드는 방법을 찾아보다가 기록하는 포스팅이다.
char arg[4] = {'0','7','7','7'};
arg = "0777"인데, 이를 8진수인 0777로 바꾸려고 한다.
int num_arg[4] = {0,};
for(int i=0; i<4; i++)
num_arg[i] = arg[i]-'0'; // 문자와 형태가 같은 숫자로 변환
mode_t mode;
mode = num_arg[3];
mode = mode | (num_arg[2]<<3);
mode = mode | (num_arg[1]<<6);
mode = mode | (num_arg[0]<<9);
arg[i] - '0' 동작을 통해 '0'을 0으로, '7'를 7로 바꿀 수 있다.
num_arg = {0, 7, 7, 7}이 된다. 이를 이제 8진수 0777로 바꿀 것이다.
mode 변수는 int형으로 선언해줘도 된다.
mode 변수에 우선 일의 자리인 num_arg[3]을 할당하고 이는 일의 자리이므로 shift하지 않는다. => mode = 7
다음으로 num_arg[2]을 8^1 자리에 할당해야 하므로 왼쪽으로 3 shift해서 2^3 = 8^1 자리의 값으로 만든다. 그리고 이전 값과 OR 연산을 해주면 => mode = 77
다음으로 num_arg[1]을 8^2 자리에 할당해야 하므로 왼쪽으로 6 shift해서 2^6 = 8^2 자리의 값으로 만든다. 그리고 이전 값과 OR 연산을 해주면 => mode = 777
마지막으로 num_arg[0]도 똑같이 해주면 mode = 0777이 된다.
반응형
'C, C++' 카테고리의 다른 글
[C] 파일 입출력 함수 정리 (0) | 2021.01.08 |
---|---|
[C언어] LCS-LENGTH Top-down Memoization (0) | 2020.11.19 |
[C++] 10진수를 16진수로 변환하기 (0) | 2020.05.16 |
[C++] int를 binary로, binary를 int로 변환하기 (0) | 2020.05.10 |
[C, C++] raw 파일 읽고 쓰기, 역상으로 변환하기 (0) | 2020.04.15 |
댓글