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

如何将十六进制字符串转换为char数组 读取hex文件后转换循环无法进入如何解决

问题根因
  1. 核心原因:istringstream 使用 >> hex >> c 读取时,默认以空白字符作为数据分隔符,你拼接得到的str1是连续无分隔的十六进制字符,会被识别为单个超大整数,超出unsigned int的取值范围后直接触发流的fail状态,因此不会进入循环。
  2. 附加错误:变量k未初始化就执行++k操作,会导致数组写入位置异常,甚至越界崩溃。
  3. 可能的前置问题:如果文件路径/文件名错误,导致文件读取失败,str1为空,也会出现循环不执行的问题。
解决方法

方案1:逐字符截取转换(更简单稳定)

直接遍历拼接好的str1,每2个字符为一组做十六进制转字节,代码修改如下:

string str1;
ifstream file("hexfile");
// 新增打开失败提示,方便排查
if (!file.is_open()) {
    cout << "文件打开失败,请检查路径是否正确" << endl;
    return -1;
}

string line;
while (getline(file, line)) {
    // 校验行长度,避免短行触发substr异常
    if (line.size() >= 9 + 32) {
        string r = line.substr(9,32);
        str1.append(r);
        printf("%s\n", r.c_str());
    }
}
file.close();
printf("\n拼接后的hex字符串长度:%d\n", str1.size());
printf("%s\n", str1.c_str());

uint8_t myhexarr [128] = {0};
int k = 0; // 必须初始化索引
// 每次取2个字符转换,同时做数组边界判断
for (int i = 0; i < str1.size() && k < 128; i += 2) {
    string byte_str = str1.substr(i, 2);
    // 16进制字符串转整数
    uint8_t val = static_cast<uint8_t>(stoi(byte_str, nullptr, 16));
    myhexarr[k++] = val;
    // uint8_t要转成unsigned int输出,否则会被识别为ASCII字符
    cout << "\n" << static_cast<unsigned int>(val);
}

方案2:保留istringstream的修改方案

如果要继续使用istringstream,可以每次主动读取2个字符后再做转换:

uint8_t myhexarr [128] = {0};
int k = 0;
char buf[3] = {0};
istringstream hex_chars_stream(str1);
// 每次读取2个字符,同时做数组越界判断
while (k < 128 && hex_chars_stream.read(buf, 2)) {
    buf[2] = '\0'; // 补字符串结束符
    uint8_t val = static_cast<uint8_t>(strtoul(buf, nullptr, 16));
    myhexarr[k++] = val;
    cout << "\n" << static_cast<unsigned int>(val);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:45:03