c++怎么把十六进制HEX字符串转存为.bin二进制文件_stringstream【附源码】

张开发
2026/4/15 21:15:26 15 分钟阅读

分享文章

c++怎么把十六进制HEX字符串转存为.bin二进制文件_stringstream【附源码】
std::stringstream解析HEX字符串易丢字节因按整数单位解析且遇非法字符即停应先剔除空白符、补前导零使长度为偶数再每2字符切片用std::stoi转字节存入vector。std::stringstream 解析 HEX 字符串会丢字节直接用 std::stringstream 配合 std::hex 读取 HEX 字符串容易漏掉前导零或把奇数长度字符串截断——因为 operator 默认按整数单位如 int解析遇到非法字符就停且不检查剩余输入。HEX 字符串是 A1B3 字符std::stringstream 读成 0xA1B 后就停了但实际应补零为 0A1B 才对得上 2 字符 1 字节字符串含空格、换行、注释如 FF 00 // header默认解析器直接卡在空格处想逐字节处理std::stringstream 不提供“取两个字符转一个字节”的原子操作更稳的方案手撕两字符一组 std::stoi绕过流解析的模糊性显式按每 2 个字符切片用 std::stoi 转字节。这是可控、可调试、兼容任意格式带空格/换行/大小写混合的做法。先用 std::remove_if 剔除空白符 、 、 保留纯十六进制字符确保长度为偶数奇数时在开头补 0如 F → 0F避免越界循环步长为 2每次取 substr(i, 2)传给 std::stoi(..., nullptr, 16)结果存入 std::vectoruint8_t/uint8_t再一次性写入文件避免频繁 I/Ostd::string hex FF00A1 B2 0C;hex.erase(std::remove_if(hex.begin(), hex.end(), ::isspace), hex.end());if (hex.length() % 2) hex 0 hex;std::vectoruint8_t bin;for (size_t i 0; i hex.length(); i 2) { bin.push_back(std::stoi(hex.substr(i, 2), nullptr, 16));}std::ofstream f(out.bin, std::ios::binary);f.write(reinterpret_castconst char*(bin.data()), bin.size());写 .bin 文件时 ofstream 的 binary 模式不能省漏掉 std::ios::binary 标志Windows 下会把 0x0A 自动转成 0x0D 0x0A导致二进制错乱——这不是 bug是文本模式的定义行为。Linux/macOS 对文本/二进制模式区分不敏感但代码跨平台时必须写明f.open(out.bin, std::ios::binary) 和构造时传标志等价但后者更直观写入前务必检查 f.is_open() 和 !f.fail()HEX 解析出错 文件打开失败叠加容易静默丢数据大文件 HEX 字符串别全读进内存再处理几 MB 的 HEX 字符串比如固件 dump全加载进 std::string 再切片内存翻倍且无必要——流式解析更省资源。 RedClaw 百度推出的手机端万能AI Agent助手

更多文章