【问题标题】:Converting a string of mac address into hex in C在C中将一串mac地址转换为十六进制
【发布时间】:2020-07-26 23:40:17
【问题描述】:

我想把一串mac地址转换成十六进制格式。

  • 输入:
char remote_device_mac[] = "00a05056a810";
  • 预期输出:
uint8_t base_mac_addr[6] = {0x00,0xa0,0x50,0x56,0xa8,0x10};

我的代码:-

char dummy[2] = {0};
int j = 0;
uint8_t num = 0;
     for(int k=0;k<6;k++)
     {
        for(int i=0;i<2;i++)
            dummy[i] = remote_device_mac[i+j];

        num = (int)strtol(dummy, NULL, 8);
        j=j+2;
        sprintf(base_mac_addr[k], "%x", num);

        num = 0; 
        memset(dummy,0,2);
     }

【问题讨论】:

  • 您忘记了 NUL 字符串终止符。 dummy[2] -> dummy[3](NUL 终止符需要空间)。
  • 还要想想strtol的参数中的8。提示:8 是错误的。
  • sprintf 应该在这里做什么???你收到编译器警告了吗?将它们视为错误。
  • 我将 dummy[2] 更改为 [3] 并在 strtol 中将 8 更改为 16。在编译器中没有收到任何使用 sprintf 的警告,但此时我的代码崩溃了。我该如何改变这一点。它是一个嵌入式代码,使用MCU通过它的mac地址连接一个ble服务器。
  • 你想用 sprintf 实现什么?而不是sprintf,你想要的是:base_mac_add[k] = num),不是吗?仔细阅读sprintf的文档。

标签: c embedded hex esp32


【解决方案1】:
char dummy[2] = {0};

dummy 的大小至少有 3 个字节(2 表示十六进制值,1 表示 \0)。所以你可以声明为:

char dummy[3] = "00";

使用 base = 16 而不是 10,因为您要转换为十六进制。

num = strtol(dummy, &ptr, 16);

sprintf 不是必需的(如果要将数字复制到字符串中,请使用它)。

// assign each base_mac_addr to num.
base_mac_addr[k] = num;

最后,代码如下:

     for(int k=0;k<6;k++)
     {
        for(int i=0;i<2;i++)
            dummy[i] = remote_device_mac[i+j];
        num = strtol(dummy, &ptr, 16);
        j=j+2;
        printf("0x%2x\n", num);
        base_mac_addr[k] = num;
     }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-08
    • 2012-09-13
    • 2017-04-23
    • 2011-08-04
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2013-11-14
    相关资源
    最近更新 更多