如何将MAC地址(字符串格式)转换为整数数组?

12

如何在C中将字符串中的MAC地址转换为整数数组?

例如,我有以下存储MAC地址的字符串:

 

00:0d:3f:cd:02:5f

如何将它转换为以下形式:

uint8_t array[6] = {0x00, 0x0d, 0x3f, 0xcd, 0x02, 0x5f}
2个回答

28
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 */
}

[编辑:根据D Krueger的建议,在格式字符串的末尾添加%c以拒绝输入中的多余字符。]


5
您可以在格式字符串末尾添加%c,以确保第六个八位组之后没有多余的字符。 - D Krueger
2
根据Linux man页面的描述,“如果格式中的转换说明符数量超过指针参数的数量,则结果是未定义的。”因此最好将一个char指针作为最后一个参数添加到sscanf()函数中。 - EdH
3
此外补充一点:使用%hhx代替%x以避免使用for()循环。这将使得在sscanf()中可以将values[]替换为bytes[]。我还认为你需要一些存储空间来存储最终的%c - Tomasz W
1
在示例中,%c没有合适的变量,导致分段错误。 - tomereli
1
谢谢,已更改为%*c,这样它就不会尝试在任何地方存储转换的结果。 - TypeIA
显示剩余3条评论

3

这是少数几个我会考虑使用像 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);
}

4
不安全,而且在某些编译器中会生成警告,因为您正在传递指向类型 uint8_t 的指针,这几乎肯定不如 int 宽,而 sscanf() 正是期望的。 - TypeIA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接