You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++使用std::stringstream读取十六进制串未读满缓冲区如何解决

问题原因

  • std::uint8_t 在绝大多数标准库实现中是 unsigned char 的类型别名,使用流输入运算符 >> 读取该类型变量时,流会将其按字符类型处理,仅读取单个ASCII字符存入变量,不会将连续两个十六进制字符解析为对应的单字节数值,这就是输出仅得到第一个字符的核心原因,和写入流的操作无关。
  • 输出时直接打印 std::uint8_t 变量也会被当作ASCII字符处理,需要强制转换为整型才能输出对应的数值。

修复方案

新增一个临时的无符号整型变量承接流的十六进制解析结果,再转换为 std::uint8_t 存储,输出时同样做整型转换即可。

修复后代码

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

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

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

    ss << std::hex << line.substr(i, 2);
    std::cout << ss.str() << " ";
    ss >> temp_val;
    byte = static_cast<std::uint8_t>(temp_val);
    std::cout << std::hex << std::setfill('0') << std::setw(2) 
              << static_cast<unsigned int>(byte) << std::endl;
  }
}

运行输出

fa fa
08 08
34 34
dd dd

内容的提问来源于stack exchange,提问作者jkang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 00:57:04