我有一个程序,我想获取 MAC 地址的命令行参数,如 "./myapp 00:11:22:33:44:55"
稍后 MAC 地址用于无符号字符数组中的 struct sockaddr_ll.sll_addr
,每个元素都是 MAC 地址的一个八位字节。此函数(在博客上找到)接受命令行参数并使用冒号“:”作为分隔符将其分隔;
void StringExplode(string str, string separator, vector<string>* results){
int found;
found = str.find_first_of(separator);
while(found != string::npos){
if(found > 0){
results->push_back(str.substr(0,found));
}
str = str.substr(found+1);
found = str.find_first_of(separator);
}
if(str.length() > 0){
results->push_back(str);
}
}
接受命令行参数的代码如下所示;
unsigned char MAC[6];
vector<string> R;
string thisstring = argv[2];
StringExplode(thisstring, ":", &R);
MAC[0] = (unsigned char)atoi(R[0].c_str());
MAC[1] = (unsigned char)atoi(R[1].c_str());
MAC[2] = (unsigned char)atoi(R[2].c_str());
MAC[3] = (unsigned char)atoi(R[3].c_str());
MAC[4] = (unsigned char)atoi(R[4].c_str());
MAC[5] = (unsigned char)atoi(R[5].c_str());
printf("Ethernet %02x:%02x:%02x:%02x:%02x:%02x\n",MAC[0],MAC[1],MAC[2],MAC[3],MAC[4], MAC[5]);
但是,这会打印出“Ethernet 00:0b:16:21:2c:37”。这是因为 atoi() 正在环绕吗?我似乎无法在这里指出问题所在,但是,我觉得这可能是一种糟糕的做事方式。我是 c++ 的新手,但即使对我来说,这也感觉很啰嗦,所以我希望这里的键盘英雄能够解释它有多糟糕,并希望我如何才能使它更有效率。
谢谢。
最佳答案
问题是您将八位字节解析为十进制数而不是十六进制数 - 11 = 0xb、22 = 0x16 等。
我不确定执行此操作的大多数 C++ 方法是什么,但是您可以,例如使用 strtoul带有基本参数:
for(int i = 0; (i < 6) && (i < R.size()); ++i) {
MAC[i] = (unsigned char)strtoul(R[i].c_str(), NULL, 16);
}
关于c++如何将我的命令行参数(MAC地址)转换为无符号字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10496240/