2013-12-12 2 views

ответ

-1

Это одно из немногих мест, где я бы подумал использовать что-то вроде sscanf(), чтобы разобрать строку, поскольку MAC-адреса имеют тенденцию быть отформатированы очень жестко:

char str[] = "00:0d:3f:cd:02:5f"; 
uint8_t mac_addr[6]; 
if (sscanf(str, "%x:%x:%x:%x:%x:%x", 
      &mac_addr[0], 
      &mac_addr[1], 
      &mac_addr[2], 
      &mac_addr[3], 
      &mac_addr[4], 
      &mac_addr[5]) < 6) 
{ 
    fprintf(stderr, "could not parse %s\n", str); 
} 
+2

Не безопасно и будет генерировать предупреждения в некоторых компиляторах, потому что вы пропустите указатели на тип 'uint8_t', который почти наверняка не так широк, как' int', что и ожидает 'sscanf()'. – TypeIA

+0

Хорошо, справедливо. –

14
uint8_t bytes[6]; 
int values[6]; 
int i; 

if(6 == sscanf(mac, "%x:%x:%x:%x:%x:%x%*c", 
    &values[0], &values[1], &values[2], 
    &values[3], &values[4], &values[5])) 
{ 
    /* convert to uint8_t */ 
    for(i = 0; i < 6; ++i) 
     bytes[i] = (uint8_t) values[i]; 
} 

else 
{ 
    /* invalid mac */ 
} 

[EDIT:. Добавлен %c в конце строки формата, чтобы отказаться от избыточных символов на входе, на основе предложения D Крюгера]

+3

Вы также можете добавить% c в конец строки формата, чтобы гарантировать отсутствие посторонних символов после шестого октета. –

+0

@DKrueger Спасибо, хорошее предложение ... отредактировано соответствующим образом. – TypeIA

+2

Согласно справочной странице Linux: «Если количество спецификаций преобразования в формате превышает количество аргументов указателя, результаты не определены». Поэтому лучше всего добавить указатель на символ в качестве последнего параметра в sscanf() – EdH

Смежные вопросы