【问题标题】:How to convert a MAC address (in string) to array of integers? [closed]如何将 MAC 地址(字符串)转换为整数数组? [关闭]
【发布时间】:2013-12-31 11:20:13
【问题描述】:

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

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

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

如何将其转换为:

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

【问题讨论】:

    标签: c arrays string


    【解决方案1】:
    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 以拒绝输入中的多余字符。]

    【讨论】:

    • 您还可以在格式字符串的末尾添加一个 %c 以确保在第六个八位字节之后没有多余的字符。
    • 根据 Linux 手册页,“如果格式转换规范的数量超过指针参数的数量,则结果未定义。”所以最好添加一个指向 char 的指针作为 sscanf() 的最后一个参数
    • 补充:使用%hhx而不是%x来避免for()循环。这将使得在sscanf() 中用bytes[] 替换values[] 成为可能。我还认为您需要一些存储空间来存储最终的%c
    • 示例中的 %c 没有合适的变量,导致分段错误。
    • 谢谢,改为%*c,这样它就不会尝试将转换结果存储在任何地方。
    【解决方案2】:

    这是我考虑使用类似 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);
    }
    

    【讨论】:

    • 不安全,并且会在某些编译器中生成警告,因为您将指针传递给类型 uint8_t,这几乎肯定不如 int 宽,这是 sscanf() 所期望的。
    猜你喜欢
    • 1970-01-01
    • 2013-07-18
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多