将十六进制写入文件C ++

时间:2014-02-17 02:36:18

标签: c++ string file hex

所以我知道这个问题已被多次询问过。我很抱歉再次询问,但我之前没有发现任何问题,我的具体情况。

所以我有一个程序读取文件的十六进制,修改它,并将修改后的十六进制存储在std :: string中。 例如,我如何将其写入文件

std::string wut="b6306edf953a6ac8d17d70bda3e93f2a3816eac333d1ac78";

并获得其值

.0n..:j..}p...?*8...3..x

在输出文件中?

我不想使用sprintf,但我想如果有必要,我会尽我所能。

谢谢大家, 〜P

2 个答案:

答案 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;
}