memcpy的意外结果

时间:2017-10-31 14:59:13

标签: c++

我有以下代码。我是新手,想知道下面的代码有什么问题。目的是将函数getMac中的mac值正确地传递给main。

#include <iostream>
#include <string>
#include <stdio.h>
#include <string.h>

void getMac(unsigned char *);

int main()
{
    unsigned char mac[6];
    getMac(mac);
    printf("back to main(), mac is %02x:%02x:%02x:%02x:%02x:%02x\n",
        mac[0],mac[1],mac[2], mac[3], mac[4], mac[5]);
}

void getMac(unsigned char *mac)
{
    unsigned char eth[] = "44:bg:23:1f:20:77";
    printf("eth: %s\n", eth);
    memcpy(mac, eth, 6);
    return;
}

2 个答案:

答案 0 :(得分:3)

如果您复制"44:bg:23:1f:20:77"的6个字节,则会获得['4', '4', ':', 'b', 'g', ':']。显然,那不是你期望得到的。这就是你的代码出了什么问题:你期望memcpy做一些非复制字节的事情。

  

目的是将函数getMac中的mac值正确地传递给main。

正确获取函数值的一种方法是复制整个字符串,而不仅仅是前6个字节。另一种方法是将十六进制字符串转换为整数表示。第三种选择是将原始mac放在第一位的整数表示中。

答案 1 :(得分:1)

MAC地址由6个字节组成,但您拥有的文本"44:bg:23:1f:20:77")超过6个字节。这是MAC地址的有效文字表示,但如果您想要数字值,则必须翻译这六个字段中的每一个(包括可能错误的bg成为价值观。我不想在这里编写解析器,但一般来说,你需要做的是:

mac[0] = std::stoul("44", 0, 16);
mac[1] = std::stoul("bg", 0, 16); // ?
mac[2] = std::stoul("23", 0, 16);
mac[3] = std::stoul("1f", 0, 16);
mac[4] = std::stoul("20", 0, 16);
mac[5] = std::stoul("77", 0, 16);