这是一个经常出现的问题,但我找不到合适的答案。
我有一个包含HEX值的char数组。我需要在文本文件中编写这个数组"作为字符串"。
我对HEX没有存储在文件中的看法(看起来垃圾数据)存在缺陷。在十六进制编辑器中,我可以看到数据。
My Hex数组实际上是整数数组而不是字符。我需要考虑这一点。
我试过了:
FILE * out = fopen(out_file_name, "w");
char *in = (char*)malloc(sizeof(char) * num_encryption * 16);
....
fwrite(in, sizeof(char), num_encryption*16 + 1, out);
我也尝试了stream
,但它再次在文本文件中打印垃圾。
in
数组包含如下所示的HEX字符串:21c169ea622e7d52ecd35423f4c3c9f4
,总共有32行(num_encryption=32
)。
我也试过这样的事情:
std::ofstream outfile(argv[21]);
if(outtfile.is_open()){
//outtfile.write(wo, sizeof(char)*(num_encryption*16+1));
for(int k = 0; k < num_encryption; k++){
for(int j = 0; j < 16; ++j){
outfile << static_cast<unsigned char>(wo[j + k*16] & 0xff);
}
outtfile << std::endl;
}
}
即使是评论的部分也无法正常工作。 有什么建议吗?
解决方案
我只是将输出(很好)重定向到文件:
FILE * out = fopen(out_file_name, "w");
for(int k = 0; k < num_encryption; k++){
for(int j = 0; j < 16; ++j){
fprintf(outfile, "%02x", wo[j + k*16] & 0xff);
}
fprintf(outfile, "\n");
}
fclose(outfile);
我不确定这是否是最优雅的解决方案,但它对我有用。如果您对此有任何了解,请在此处添加。
答案 0 :(得分:1)
如果问题也与C ++有关,那么让我就如何使用C ++取代的功能给出建议。您正在使用C风格的功能。
你应该使用iostreams。避免使用malloc,使用new,但更好的是直接使用vector<char>
或unique_ptr<char[]>
。在这种情况下,我将使用unique_ptr<char[]>
,因为它似乎不需要调整数组的大小。我假设你想在下面写一个二进制文件。
//I assume you want a binary file
std::ostream file("myfile.txt", std::ios::binary);
std::unique_ptr<char []> in = std::unique_ptr<char []>(new char[num_encryption * 16]);
if (file)
file.write(in.get(), sizeof(char) * num_encryption * 16);
如果您想要以十六进制格式写入文本数据,请以文本模式打开文件:
std::ostream file("myfile.txt"); //Note, no std::ios::binary
...
file >> std::hex >> std::noshowbase; //Write in hex with no base
std::copy(in.get(),
in.get() + num_encryption * 16,
std::ostream_iterator<char>(file)); //Write one char at a time, in hex, with no base
警告:未经测试,只显示了如何编写二进制或格式化十六进制文本的想法,char为char。