首页 > 解决方案 > c++ stringstream read 似乎没有读取整个缓冲区

问题描述

我有以下代码:https ://godbolt.org/z/9aqqe5eYh

#include<string>
#include<sstream>
#include<iomanip>
#include<iostream>

int main() {
  std::string line = "fa0834dd";

  for(int i = 0; i < line.length(); i += 2) {
    std::stringstream ss;
    std::uint8_t byte;

    ss << std::hex << line.substr(i, 2);
    std::cout << ss.str() << " ";
    ss >> byte;
    std::cout << std::hex << std::setw(2) << byte << std::endl;
  }
}

理想情况下,这会接收一串十六进制数字,将它们拆分为字节(一对十六进制数字)并将其存储为字节(出于说明目的,我std::uint8_t在上面只使用了一个)。上面的代码输出这个:

Program returned: 0
Program stdout
fa  f
08  0
34  3
dd  d

这似乎有点奇怪。一个std::uint8_t应该足以存储 2 个十六进制字符的数据。但似乎ss >> byte只存储前十六进制字符。我的猜测是:

ss << std::hex << line.substr(i, 2);

实际上将每个十六进制字符存储为 1 个字节?

如何修复上述代码以生成等于字符串中 2 个十六进制字符的单字节值?

标签: c++stringstringstream

解决方案


stringstream不符合将字符表示解析为字节值的条件。

您可以使用类似的东西strtol将字符串实际解析为值。

#include<string>
#include<sstream>
#include<iomanip>
#include<iostream>

int main() {
  std::string line = "fa0834dd";

  for(int i = 0; i < line.length(); i += 2) {
    std::string ss = line.substr(i,2);
    
    std::cout << ss << " ";

    std::uint8_t byte = static_cast<std::uint8_t>(strtol(ss.c_str(), NULL, 16));
    std::cout << std::hex << static_cast(byte) << std::endl;
  }
}

参考帖子


推荐阅读