[C/C++] 문자열 타입의 MAC ADDRESS 포멧 확인 (sscanf)

2019. 3. 19. 13:15Programming/C, C++

반응형

Front-end에서 MAC ADDRESS를 전달하는 경우 값이 변경될 수 있으므로, 최소한 전달받은 문자열이 MAC ADDRESS양식에 맞는지는 확인할 필요가 있었다. 특히 MAC ADDRESS를 문자열 형태로 저장할 때는 더더욱이나. 검색하면 어렵지 않게 찾을 수 있는 내용이지만, 업무가 바빠서 사이드 프로젝트를 못하니 뭐라도 정리하기로 했다.

#include <stdio.h>

int sscanf(const char *buffer, const char *format, argument-list);

 

sscanfbuffer에 저장된 데이터를 지정된 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]));

}

위의 함수대로 구현하면 macAddressNULL이거나 %02x:%02x:%02x:%02x:%02x:%02x형태가 아닌 경우, -1을 반환하게 된다. 추가적으로 sscanf함수는 buffer의 크기가 작으면 오버플로우 현상이 발생할 수 있다. %d%f를 사용할 때는 사이즈가 고정되어있기 때문에 상관이 없지만, 지금처럼 %s를 사용하거나 %c를 사용할 경우에는 sscanf_s를 사용하는게 좋다. 단, sscanf_sC11부터 제공한다.

 

참고:

반응형