c++如何将我的命令行参数(MAC地址)转换为无符号字符

标签 c++ unsigned-char string-conversion

我有一个程序,我想获取 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/

相关文章:

javascript - 在 firebreath 的 javascript 端创建一个 JSAPIPtr

c++ - 如何调试 OpenGL 程序?

c++ - 别名规则是对称的吗?

c - 如何将 8 字节十六进制枚举值添加到 unsigned char 指针?

python - 遍历字符串的一部分

c++ - 如果手动关闭程序,是否会调用析构函数?

c++ - ifstream 将字符串的行转换为数组?

c++ - 如何将字节数据从套接字写入 C 中的无符号字符 vector ?

c - WinPE环境下C/C中的变体字符串转换