Разбор MAC-адреса

У меня есть MAC-адрес, такой как «6F: e: 5B: 7C: b: a», который я хочу проанализировать и вставить неявные нули перед: e :,: b :,: a.

Я не могу использовать Boost в данный момент, но у меня есть грубое решение. Решение разделяется на ‘:’. Затем я посчитал символы между ними и, если есть только один, я вставил ноль впереди.

Мне было интересно, есть ли у кого-нибудь более быстрый подход?

0

Решение

Прежде всего вы можете использовать скрипт, который будет конвертировать char в int довольно быстро, так что:

unsigned char hex_to_int(const char c)
{
if( c >= 'a' && c <= 'f'){
return c - 'a' + 10;
}

if( c >= 'A' && c <= 'F'){
return c - 'A' + 10;
}

if( c >= '0' && c <= '9'){
return c - '0';
}

return 0;
}

Затем вы можете создать цикл, который будет перебирать строку:

unsigned char mac[6]; /* Resulting mac */
int i; /* Iteration number */
char *buffer; /* Text input - will be changed! */
unsigned char tmp; /* Iteration variable */

for( i = 0; i < 6; ++i){
mac[i] = 0;

/*
* Next separator or end of string
* You may also want to limit this loop to just 2 iterations
*/
while( ((*buffer) != '\0') && ((*buffer) != ':'){
mac[i] <<= 4;
mac[i] |= hex_to_int( *buffer);
++buffer;
}
}

if( (i != 6) || (*buffer != NULL)){
// Error in parsing, failed to get to the 6th iteration
// or having trailing characters at the end of MAC
}

Эта функция не выполняет проверку ошибок, но, вероятно, это самое быстрое решение, которое вы получите.

1

Другие решения

Для быстрых и грязных:

if (sscanf(text, "%x:%x:%x:%x:%x:%x",
&mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) != 6) {
// handle error
}

Обратите внимание, что он не проверяет, являются ли числа действительно шестнадцатеричными. Применяются обычные меры предосторожности для sscanf ().

1

По вопросам рекламы [email protected]