将十六进制数组作为 C/C++ 中的字符串写入文件
Write hex array to the file as string in C/C++
这是一个常见问题,但我找不到合适的答案。
我有一个包含十六进制值的字符数组。我需要将此数组写入文本文件 "as a string".
我对 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);
我不确定这是否是最优雅的解决方案,但它适合我。如果您有更好的了解,请在此处添加。
如果问题也是关于 C++ 的,让我就如何使用被 C++ 取代的功能给你一些建议。您正在使用 C-style 项功能。
您应该使用 iostream。避免 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
警告:未经测试,只是展示了如何逐个字符地编写二进制或格式化的十六进制文本的想法。
这是一个常见问题,但我找不到合适的答案。
我有一个包含十六进制值的字符数组。我需要将此数组写入文本文件 "as a string".
我对 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);
我不确定这是否是最优雅的解决方案,但它适合我。如果您有更好的了解,请在此处添加。
如果问题也是关于 C++ 的,让我就如何使用被 C++ 取代的功能给你一些建议。您正在使用 C-style 项功能。
您应该使用 iostream。避免 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
警告:未经测试,只是展示了如何逐个字符地编写二进制或格式化的十六进制文本的想法。