2019. 3. 19. 13:15ㆍProgramming/C, C++
Front-end에서 MAC ADDRESS를 전달하는 경우 값이 변경될 수 있으므로, 최소한 전달받은 문자열이 MAC ADDRESS양식에 맞는지는 확인할 필요가 있었다. 특히 MAC ADDRESS를 문자열 형태로 저장할 때는 더더욱이나. 검색하면 어렵지 않게 찾을 수 있는 내용이지만, 업무가 바빠서 사이드 프로젝트를 못하니 뭐라도 정리하기로 했다.
#include <stdio.h>
int sscanf(const char *buffer, const char *format, argument-list);
sscanf
는 buffer
에 저장된 데이터를 지정된 format
에 맞는 형식으로 읽어들이며, 성공적으로 변환된 필드 수를 리턴한다. 따라서 00:00:00:00:00:00
과 같은 형식으로 문자열을 전달받았을 때, sscanf
를 사용하여 다음과 같이 읽어들이는 게 가능하다.
char mac[] = "00:00:00:00:00:00";
int bytes[6]={0,};
sscanf(mac, "%02x:%02x:%02x:%02x:%02x:%02x", &bytes[5], &bytes[4], &bytes[3], &bytes[2], &bytes[1], &bytes[0]);
이 때 sscanf
는 전달받은 6개의 값으로 파싱이 되므로, 6을 반환하게 된다. 또한 MAC ADDRESS가 %02x:%02x:%02x:%02x:%02x:%02x
로 전달된다고 약속한다면, 길이값을 기준으로 MAC ADDRESS가 VALID한 값인지 확인할 수 있다. 이를 종합하면 다음과 같은 코드를 통해서 MAC ADDRESS가 VALID한지 확인할 수 있다.
int validateMacAddress(const char* macAddress) {
int bytes[6]={0,};
memset(bytes, 0x00, sizeof(bytes));
if (macAddress == NULL) {return -1;}
if (strnlen(macAddress, sizeof(macAddress)) != 17) {return -1;}
return (6 == sscanf(mac, "%02x:%02x:%02x:%02x:%02x:%02x", &bytes[5], &bytes[4], &bytes[3], &bytes[2], &bytes[1], &bytes[0]));
}
위의 함수대로 구현하면 macAddress
가 NULL
이거나 %02x:%02x:%02x:%02x:%02x:%02x
형태가 아닌 경우, -1을 반환하게 된다. 추가적으로 sscanf
함수는 buffer
의 크기가 작으면 오버플로우 현상이 발생할 수 있다. %d
나 %f
를 사용할 때는 사이즈가 고정되어있기 때문에 상관이 없지만, 지금처럼 %s
를 사용하거나 %c
를 사용할 경우에는 sscanf_s
를 사용하는게 좋다. 단, sscanf_s
는 C11
부터 제공한다.
참고:
'Programming > C, C++' 카테고리의 다른 글
Onvif 라이브러리 크로스 컴파일 방법 정리 (0) | 2022.01.05 |
---|---|
libcrypt.so와 glibc의 크로스 컴파일에 대하여 (0) | 2020.05.18 |
[C/gLib] trim과 문자열을 찾는 함수 작성하기 (0) | 2019.04.26 |
GLib을 이용해서 문자열 나누기(g_strsplit) (2) | 2019.04.17 |
[C/C++] 정수를 IP주소로 변환하기 (Decimal to IP Address) (0) | 2019.03.18 |