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

C++使用ifstream读取二进制hex文件时无法识别0d字节问题求解

解决方案
  • 首先修正文件打开参数,显式指定读模式+二进制模式,避免部分STL实现默认参数异常:
    把原ifstream构造行替换为:
    std::ifstream input(argv[1], std::ios::in | std::ios::binary);
    
  • 替换迭代器读取逻辑为更可靠的read方法,避免STL迭代器实现差异导致的字符隐式转换问题:
    完整的读取代码参考如下:
    #include <fstream>
    #include <vector>
    #include <cstdio>
    
    int main(int argc, char** argv) {
        if (argc < 2) return 1;
        std::ifstream input(argv[1], std::ios::in | std::ios::binary);
        if (!input.is_open()) {
            printf("open file failed\n");
            return 1;
        }
        // 获取文件总大小
        input.seekg(0, std::ios::end);
        const std::streamsize file_size = input.tellg();
        input.seekg(0, std::ios::beg);
        // 预分配缓冲区
        std::vector<unsigned char> buffer(file_size);
        // 一次性读取全部内容
        input.read(reinterpret_cast<char*>(buffer.data()), file_size);
        // 验证读取字节数和文件大小一致
        printf("read size: %lld, file size: %lld\n", (long long)input.gcount(), (long long)file_size);
        // 校验是否存在0d字节
        size_t od_count = 0;
        for (size_t i = 0; i < buffer.size(); i++) {
            if (buffer[i] == 0x0d) od_count++;
        }
        printf("0d byte count: %zu\n", od_count);
        return 0;
    }
    
  • 排查过往方法失败的原因:
    1. 用C语言fgets、fread时如果没有指定rb二进制打开模式,Windows平台会默认以文本模式打开,自动将\r\n转换为\n,丢弃0x0d字节
    2. 之前用迭代器构造vector的逻辑在部分旧版STL实现中存在字符类型转换的隐式坑,改用read直接读取原始字节可完全规避该问题
  • 额外验证步骤:
    先对比打印出的读取字节数和系统中文件的实际大小,如果两者一致说明数据已经全部读入缓冲区,此时再遍历查找0x0d字节即可,不存在丢失问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:15:00