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

Lio*_*mov 8 c arrays string

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

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

00:0D:3F:CD:02:5F

我如何将其转换为:

uint8_t array[6] = {0x00, 0x0d, 0x3f, 0xcd, 0x02, 0x5f}
Run Code Online (Sandbox Code Playgroud)

Typ*_*eIA 23

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 */
}
Run Code Online (Sandbox Code Playgroud)

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

  • 您还可以在格式字符串的末尾添加%c,以确保在第六个八位字节后没有无关的字符. (3认同)
  • 最重要的是:使用`%hhx`代替`%x`以避免`for()`循环。这将使在 `sscanf()` 中用 `bytes[]` 替换 `values[]` 成为可能。我还认为您需要一些存储空间来存放最终的 `%c`。 (3认同)
  • 根据Linux手册页,"如果格式转换规范的数量超过指针参数的数量,则结果是未定义的." 所以最好添加一个指向char的指针作为sscanf()的最后一个参数 (2认同)

Tim*_*rce 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 不安全,并且会在某些编译器中生成警告,因为您传递的是类型“uint8_t”的指针,该类型几乎肯定没有“int”那么宽,而“int”正是“sscanf()”所期望的。 (4认同)