我在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/