所以我知道这个问题已被多次询问过。我很抱歉再次询问,但我之前没有发现任何问题,我的具体情况。
所以我有一个程序读取文件的十六进制,修改它,并将修改后的十六进制存储在std :: string中。 例如,我如何将其写入文件
std::string wut="b6306edf953a6ac8d17d70bda3e93f2a3816eac333d1ac78";
并获得其值
.0n..:j..}p...?*8...3..x
在输出文件中?
我不想使用sprintf,但我想如果有必要,我会尽我所能。
谢谢大家, 〜P
答案 0 :(得分:2)
如果我正确理解了您的问题,您希望将文本转换为等效的数字,然后写入文件。鉴于您在问题中提供的提示,看起来应该逐字节完成。以下是实现这一目标的一种方法。请注意,需要将字符串中的每个字节转换为整数值。
#include <string>
#include <sstream>
#include <iostream>
#include <fstream>
#include <ios>
std::string wut = "b6306edf953a6ac8d17d70bda3e93f2a3816eac333d1ac78";
int main()
{
std::ofstream datafile("c:\\temp\\temp1.dat", std::ios_base::binary | std::ios_base::out);
char buf[3];
buf[2] = 0;
std::stringstream input(wut);
input.flags(std::ios_base::hex);
while (input)
{
input >> buf[0] >> buf[1];
long val = strtol(buf, nullptr, 16);
datafile << static_cast<unsigned char>(val & 0xff);
}
}
答案 1 :(得分:0)
Peter R的回答将导致输出不是100%相等,因为stringstream以非预期的方式连续解释了一个'0'。
例如:如果我们要写十六进制值“00000000”,则stringstream将输出“000000”。
以下解决方案适用于所有情况,无论十六进制字符串中包含多少个零:
// input: std::string hex; (e.g. = "180f00005e2c3415" or longer)
std::basic_string<uint8_t> bytes;
for (size_t i = 0; i < hex.length(); i += 2) {
uint16_t byte;
std::string nextbyte = hex.substr(i, 2);
std::istringstream(nextbyte) >> std::hex >> byte;
bytes.push_back(static_cast<uint8_t>(byte));
}
std::string result(begin(bytes), end(bytes));
然后你可以简单地将这个字符串写成这样的文件:
std::ofstream output_file("filename", std::ios::binary | std::ios::out);
if (output_file.is_open()) {
output_file << result;
output_file.close();
} else {
std::cout << "Error could not create file." << std::endl;
}