我是 C++ 的新手,我的问题是我找到了一种方法来使用 printf
在输出中进行文本格式化,但是我找不到在字符串变量中正确格式化文本的方法.我的最终目标是将当前 mac 地址保存在一个字符串变量中,并将其与另一个变量进行比较。
这是我的代码:
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/if.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
int main()
{
struct ifreq s;
int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
char mac[6];
int ret;
strcpy(s.ifr_name, "enp5s0");
if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) {
printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
(unsigned char) s.ifr_hwaddr.sa_data[0],
(unsigned char) s.ifr_hwaddr.sa_data[1],
(unsigned char) s.ifr_hwaddr.sa_data[2],
(unsigned char) s.ifr_hwaddr.sa_data[3],
(unsigned char) s.ifr_hwaddr.sa_data[4],
(unsigned char) s.ifr_hwaddr.sa_data[5]);
if (mac_as_string == "28:d2:44:55:97:7f") {
}
return 0;
}
return 1;
}
我找不到在 mac_as_string 变量中将 mac 地址保存为字符串的方法。
最佳答案
关于文本格式和创建字符串变量,最简单的方法是使用 std::ostringstream
:
std::ostringstream macbuilder;
macbuilder << std::hex
<< std::setw(2) << unsigned(s.ifr_hwaddr.sa_data[0]) << ':'
<< std::setw(2) << unsigned(s.ifr_hwaddr.sa_data[1]) << ':'
<< std::setw(2) << unsigned(s.ifr_hwaddr.sa_data[2]) << ':'
<< std::setw(2) << unsigned(s.ifr_hwaddr.sa_data[3]) << ':'
<< std::setw(2) << unsigned(s.ifr_hwaddr.sa_data[4]) << ':'
<< std::setw(2) << unsigned(s.ifr_hwaddr.sa_data[5];
std::string macaddr = macbuilder.str();
但是如果你只是想拥有一个与另一个变量相当的变量std::array<uint8_t,6>
是要走的路:
std::array<uint8_t,6> macaddr {
s.ifr_hwaddr.sa_data[0] ,
s.ifr_hwaddr.sa_data[1] ,
s.ifr_hwaddr.sa_data[2] ,
s.ifr_hwaddr.sa_data[3] ,
s.ifr_hwaddr.sa_data[4] ,
s.ifr_hwaddr.sa_data[5] ,
};
如前所述std::array
提供 operator==()
您可以简单地使用它来与以相同方式创建的另一个变量进行比较。
关于c++ - 使用 unsigned char 的文本格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43952411/