使用unsigned char进行文本格式化

时间:2017-05-13 11:09:14

标签: c++ text-formatting unsigned-char

我是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地址保存为mac_as_string变量中的字符串。

1 个答案:

答案 0 :(得分:1)

关于文本格式和创建字符串变量,最简单的方法是使用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==(),您只需使用它来与以相同方式创建的另一个变量进行比较。