C 프로그래밍 : 네트워크 인터페이스 MAC 주소 문자열을 바이트열로 변환

반응형

본 글에서는 문자열 형태로 표현된 네트워크 인터페이스 MAC 주소를 6바이트 길이의 바이트열로 변환하는 방법에 대해 설명한다.

 

이더넷 네트워크 인터페이스의 MAC 주소는 6바이트의 길이를 가지며, 보통 다음과 같이 표현된다.

 

  • 리눅스 계열 운영체제 : 00:01:02:03:04:05
  • 윈도우즈 운영체제 : 00-01-02-03-04-05

 

MAC 주소가 위와 같은 형태의 문자열로 표현되어 있을 때(예: "00:01:02:03:04:05"), 이 문자열을 6바이트 길이의 바이트열로 변환하는 간단한 함수를 다음과 같이 구현할 수 있다.

#include <stdint.h>
#include <stdio.h>
#include <string.h>

/// MAC 주소 길이
#define MAC_ALEN 6
/// MAC 주소 문자열 길이 
#define MAC_ADDR_STR_LEN 17

/**
 * MAC 주소 문자열을 바이트열로 변환한다.
 * 
 * @param[in] mac_addr_str  MAC 주소 문자열 (예: "00:01:02:03:04:05" 또는 "00-01-02-03-04-05")
 * @param[out] mac_addr     변환된 바이트열이 저장될 배열
 * 
 * @retval 0: 성공
 * @retval -1: 실패
 */ 
int ConvertMacAddrStr2Array(const char *mac_addr_str, uint8_t mac_addr[MAC_ALEN])
{
  int res, i, val;
  char temp[MAC_ADDR_STR_LEN+1];

  /*
   * 유효하지 않은 MAC 주소 문자열 길이 
   */
  if(strlen(mac_addr_str) != MAC_ADDR_STR_LEN) {
    return -1;
  }

  /*
   * MAC 주소 문자열을 임시버퍼에 복사 후, 
   * 콜론(:) 또는 대시(-) 대신 종료 문자를 삽입하여 문자열을 분리하고 각각 16진수로 읽어 바이트열에 저장한다.
   */ 
  memcpy(temp, mac_addr_str, MAC_ADDR_STR_LEN);
  for(i = 0; i < MAC_ALEN; i++) {
    temp[(3*i)+2] = '\0';
    res = sscanf((const char *)&temp[3*i], "%x", &val);
    if (res == 0) {
      return -1;
    }
    mac_addr[i] = (char)val;
  }
  return 0;
}


/**
 * 테스트 어플리케이션
 */ 
int main(int argc, char *argv[])
{
  char *mac_addr_str = "00:01:02:03:04:05";
  uint8_t mac_addr[MAC_ALEN];

  int ret = ConvertMacAddrStr2Array(mac_addr_str, mac_addr);
  if (ret) {
    printf("Fail to convert MAC address string\n");
    return -1;
  } 

  printf("MAC address string - %s\n", mac_addr_str);
  printf("MAC address - %02X:%02X:%02X:%02X:%02X:%02X\n", 
    mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  return 0;
}

 

댓글

Designed by JB FACTORY