我有以下代码。我是新手,想知道下面的代码有什么问题。目的是将函数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;
}
答案 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);