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
相关产品推荐
相关产品推荐

