我在std::string中保存了一个十六进制MAC地址。将MAC地址转换为uint64_t中保存的整数类型的最佳方法是什么?

我知道stringstream,sprintf,atoi等。实际上,我对其中的前两个编写了很少的转换函数,但是它们似乎比我想要的更草率。

因此,有人可以向我展示一种很好的,干净的转化方式

std::string mac = "00:00:12:24:36:4f";

进入uint64_t?

PS:我没有可用的boost/TR1功能,也无法将它们安装在实际使用代码的位置(这也是为什么我没有复制粘贴的尝试之一,对此感到抱歉!)。因此,请保留直接C/C++调用的解决方案。如果您对UNIX系统调用有一个有趣的解决方案,我也将感兴趣!

最佳答案

uint64_t string_to_mac(std::string const& s) {
    unsigned char a[6];
    int last = -1;
    int rc = sscanf(s.c_str(), "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx%n",
                    a + 0, a + 1, a + 2, a + 3, a + 4, a + 5,
                    &last);
    if(rc != 6 || s.size() != last)
        throw std::runtime_error("invalid mac address format " + s);
    return
        uint64_t(a[0]) << 40 |
        uint64_t(a[1]) << 32 | (
            // 32-bit instructions take fewer bytes on x86, so use them as much as possible.
            uint32_t(a[2]) << 24 |
            uint32_t(a[3]) << 16 |
            uint32_t(a[4]) << 8 |
            uint32_t(a[5])
        );
}

关于c++ - 将MAC地址std::string转换为uint64_t,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7326123/

10-10 13:05