[C/C++] 문자열 타입의 MAC ADDRESS 포멧 확인 (sscanf)
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
부터 제공한다.
참고: