带有无符号字符的文本格式

Posted

技术标签:

【中文标题】带有无符号字符的文本格式【英文标题】:text formatting with unsigned char 【发布时间】:2017-05-13 11:09:13 【问题描述】:

我是 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 变量中的字符串的方法。

【问题讨论】:

" 我的最终目标是将当前的 mac 地址保存在一个字符串变量中,并与另一个变量进行比较。" 好吧,你可以使用 std::ostringstream 并服从我的命令'已经说过here。 有什么理由不使用std::array?那么你就不必使用字符串了,因为它已经定义了等于运算符。 @Jonas 这个主意不错。 @jonas 我是 C++ 的新手,所以我使用了我找到的示例代码来获取 mac 地址,现在我在将结果保存在字符串变量中时遇到了问题。 @nim4n 如果您想要创建字符串的示例代码,我可以写一个答案。不过,如果只是比较,@Jonas 提出的是更好的主意。您可以改进您的问题,以扩展您想要实际比较的位置和内容。 【参考方案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&lt;uint8_t,6&gt; 是要走的路:

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==(),您可以简单地使用它与以相同方式创建的另一个变量进行比较。

【讨论】:

我收到此错误:mac.cpp:27:68: 警告:缺少终止字符 @nim4n 抱歉,已解决。我打字太快了。 在第一个代码中我得到了这个错误:在'unsigned' 第二次编辑帖子时,我的最终目标是将输出与简单字符串进行比较,我是否也应该将字符串更改为数组

以上是关于带有无符号字符的文本格式的主要内容,如果未能解决你的问题,请参考以下文章

将 Long/ULong 转换为带有填充零的无符号十六进制字符串

带有输入无符号字符缓冲区 C++ 的 DeviceIoControl

如何将带有尾随x的数字字符串转换为无符号数字列表

无符号字符的格式说明符

将无符号字符读入字符串

字符串格式符