【发布时间】:2022-01-17 10:28:39
【问题描述】:
我有一个函数,它将十六进制字符串保存到二进制文件中。
void save_in_binary(std::string& str, std::ofstream& outfile) {
char buf[3];
buf[2] = 0;
std::stringstream input(str);
input.flags(std::ios_base::hex);
while (input >> buf[0] >> buf[1]) {
long val = strtol(buf, nullptr, 16);
outfile << static_cast<unsigned char>(val & 0xff);
}
}
另一个,之后会读它
int parse_binary_text(std::string& name, std::string& text) {
std::ifstream myfile(name, std::ios::binary);
unsigned int tmp = 0; // flag
std::stringstream input;
if (myfile.is_open()) {
while (!myfile.eof()) {
tmp = myfile.get();
if (tmp == UINT_MAX)
break;
input << std::hex << tmp;
}
text = input.str();
}
else
return 0;
}
但是在保存十六进制字符串“0FFE00”后,我读取了“FFE0”。似乎我的读取函数跳过了零字节。调试表明当tmp(在代码中标记)等于0时,std::hex什么也不写——这就是问题所在。所以,这提示了我的问题:我该如何解决这个问题?
【问题讨论】:
-
不要使用
while (input)作为停止条件。而是检查文件结尾。 -
@LouisGo,现在已修复,但不幸的是,它并没有解决问题
-
"但是在保存十六进制字符串 "0FE00" 后,我会读取 "FFE0"" 当您保存该字符串时,您打算输出文件的长度是多少字节?您打算将这些字节的数值设为什么?为什么?你希望得到什么字符串?我不清楚你打算如何将奇数个十六进制数字转换为字节,因为恰好两个这样的数字代表一个字节。
-
另外:您在
void save_in_binary(std::string& str, std::ofstream& outfile) {中的意图是outfile已以二进制模式打开,是吗?当您在这样的文件上使用operator<<时,您期望会发生什么?为什么?你熟悉.write成员函数吗? -
@KarlKnechtel。我将二进制转换为十六进制,然后将十六进制字节保存在二进制文件中。接下来我试图读取它们并将它们转换回二进制字符串。我使用十六进制编辑器打开了输出文件,它显示
0F FE 00- 这是我正在寻找的输出(间距是可选的)
标签: c++ stl binaryfiles ifstream ofstream