【发布时间】:2017-07-31 18:15:18
【问题描述】:
我正在将二进制文件 cmd.exe 读入无符号字符数组。读入 bytes_read 的总字节数为 153。我将其转换为 base64 字符串,然后将此字符串解码回(来自第二个答案 base64 decode snippet in c++ 的代码)为向量。这里 BYTE 是无符号字符。 decodedData.size() 也是 153。但是当我以二进制模式将此向量写入文件以再次获取我的 cmd.exe 文件时,我只得到 1 KB 文件。我错过了什么?
// Reading size of file
FILE * file = fopen("cmd.exe", "r+");
if (file == NULL) return 1;
fseek(file, 0, SEEK_END);
long int size = ftell(file);
fclose(file);
// Reading data to array of unsigned chars
file = fopen("cmd.exe", "r+");
unsigned char * myData = (unsigned char *)malloc(size);
int bytes_read = fread(myData, sizeof(unsigned char), size, file);
fclose(file);
std::string encodedData = base64_encode(&myData[0], bytes_read);
std::vector<BYTE> decodedData = base64_decode(encodedData);
////write data to file
ofstream outfile("cmd.exe", ios::out | ios::binary);
outfile.write((const char *)decodedData.data(), decodedData.size());
更新: 感谢@chux 建议 "r+" --> "rb+" 问题已解决。
【问题讨论】:
-
1 kb 可能是最小的非空文件...你看过文件了吗?
-
为什么在 c++ 代码中使用 fopen?
-
如果
cmd.exe是二进制的,也应该以二进制方式读取。 -
比在 C++ 中使用
fopen和fread还要糟糕,为什么在 C++ 代码中使用malloc? -
建议
"r+"-->"rb+"