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

