【问题标题】:Cast to right operand of extraction operator (>>)转换为提取运算符的右操作数 (>>)
【发布时间】:2020-11-20 21:51:56
【问题描述】:

我找不到有类似问题的人,所以我决定创建一个新问题。

我目前正在尝试从字符串流中提取 1 字节大小的十六进制值,我计划将提取的值存储在 unsigned char 中,问题是,字符串流将从流中提取单个字符并将其存储在我的变量。我想这是可以理解的,因为我成功地使用了一个短整数来提取我的值,并且它完美地工作。现在我知道了我的问题,我想我可以简单地将变量转换为数值,同时将其保留为无符号字符,但显然我不可能将其转换为提取运算符的正确操作数:

注意:byte 是 unsigned char 的 typedef,而不是 std::byte。

以下是一些尝试:

我可以使用 short 而不是 char,但我想知道是否有办法解决这个问题,使用成员运算符>>() 对我也不起作用!

编辑:这就是我的 stringstream 字符串的样子:“11 A7 D9 13 6D 9D ED DA FD F4 F1”。我想将十六进制的 11(十进制的 17)提取到我的 byteBuffer 变量中。

【问题讨论】:

  • 重载不是针对short,而是针对short &,因为当您从输入中读取时,您想写入变量。
  • 对不起,我没说清楚,我的意思是我的值范围从 0x00 到 0xFF,值可以存储在单个 8 位字节中。
  • 我认为没有任何方法可以直接使用字节变量来做到这一点。只需读入一个short,然后将short分配给字节。
  • 不要放代码/文字的图片。将其作为格式化文本包含在问题中。
  • 只要读入任意非字符整数类型,然后提取完成后,将值转换后放到你想要的地方。

标签: c++ visual-studio visual-c++ stringstream


【解决方案1】:

您必须阅读这两个字符并进行转换。您可以创建一个类来处理它,例如:

struct Byte
{
    std::uint8_t c;  
};

std::istream& operator >> (std::istream& is, Byte& b)
{
    unsigned int n;
    is >> std::hex >> n;
    b.c = n;
    return is;
}

Demo

【讨论】:

  • 或者直接用std::hex读入一个unsigned局部变量,读完后存入byte变量。
  • @BenVoigt:确实,更好。改变了。
  • 我曾想过使用重载,但决定反对它,因为它为我需要的东西增加了太多不必要的复杂性。不过会很好用。
猜你喜欢
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 2011-01-11
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多