从 linux 上的字符缓冲区写入二进制文件
Write Binary file from char buffer on linux
所以我是 linux C++ 编程的新手,我正在尝试将二进制文件(.dll、.exe 等)的内容写入 .txt 以测试并查看结果操作,代码工作并将 .txt 文件和一些二进制文件写入其中,但是当我打开 .txt 文件时,里面没有写入完整的二进制文件,问题是由于据我所知无效的 unicode。
为了更好的理解,这里有一个截图:
Click here to see image from Whosebug
或
打开.txt文件时的文本输出:
MZ[=11=][=11=][=11=][=11=][=11=]
这是我正在使用的代码(可重现的示例):
#include <algorithm>
#include <array>
#include <chrono>
#include <cstring>
#include <fstream>
#include <functional>
#include <iostream>
#include <memory>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
#include <unordered_map>
#include <unordered_set>
std::vector<char> buffer;
bool read_file(std::string name, std::vector<char>& out)
{
std::ifstream file(name.c_str(), std::ios::binary);
if (!file.good())
{
return false;
}
file.unsetf(std::ios::skipws);
file.seekg(0, std::ios::end);
const size_t size = file.tellg();
file.seekg(0, std::ios::beg);
out.resize(size);
file.read(out.data(), size);
file.close();
return true;
}
void write_text_to_log_file(char* text)
{
std::ofstream log_file("log_file.txt", std::ios_base::out | std::ios_base::app );
log_file.write(text, sizeof(text));
}
int main(int argc, char* argv[])
{
read_file("bin.dll", buffer);
printf("Image Array: %s\r\n", buffer.data());
printf("Image Size: %zu\r\n", buffer.size());
write_text_to_log_file(buffer.data());
}
感谢任何帮助,我正在尝试做与 php 的 file_get_contents 完全相同的事情,并使用原始二进制缓冲区写入文件,例如将原始二进制文件写入 .dll 格式.exe、.png 等
log_file.write(text, sizeof(text));
sizeof
是一个 编译时间常数 ,它给你大小 对象。 text
是一个 char *
,所以这给你总计 4 或 8,这取决于你编译的是 32 位还是 64 位二进制文件。 text
指向的只是几个字节,还是指向《哈利波特与死亡圣器》的全部内容都没有关系。 sizeof
总是会为您生成 4 或 8,无论 text
.
中的内容是什么
您需要在此处传递一个额外的参数,该参数来自存储数据的 std::vector
的 buffer.size()
,并在此处使用它。 sizeof()
是 而不是 与 std::vector
的方法“size
”相同。
所以我是 linux C++ 编程的新手,我正在尝试将二进制文件(.dll、.exe 等)的内容写入 .txt 以测试并查看结果操作,代码工作并将 .txt 文件和一些二进制文件写入其中,但是当我打开 .txt 文件时,里面没有写入完整的二进制文件,问题是由于据我所知无效的 unicode。
为了更好的理解,这里有一个截图:
Click here to see image from Whosebug
或
打开.txt文件时的文本输出:
MZ[=11=][=11=][=11=][=11=][=11=]
这是我正在使用的代码(可重现的示例):
#include <algorithm>
#include <array>
#include <chrono>
#include <cstring>
#include <fstream>
#include <functional>
#include <iostream>
#include <memory>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
#include <unordered_map>
#include <unordered_set>
std::vector<char> buffer;
bool read_file(std::string name, std::vector<char>& out)
{
std::ifstream file(name.c_str(), std::ios::binary);
if (!file.good())
{
return false;
}
file.unsetf(std::ios::skipws);
file.seekg(0, std::ios::end);
const size_t size = file.tellg();
file.seekg(0, std::ios::beg);
out.resize(size);
file.read(out.data(), size);
file.close();
return true;
}
void write_text_to_log_file(char* text)
{
std::ofstream log_file("log_file.txt", std::ios_base::out | std::ios_base::app );
log_file.write(text, sizeof(text));
}
int main(int argc, char* argv[])
{
read_file("bin.dll", buffer);
printf("Image Array: %s\r\n", buffer.data());
printf("Image Size: %zu\r\n", buffer.size());
write_text_to_log_file(buffer.data());
}
感谢任何帮助,我正在尝试做与 php 的 file_get_contents 完全相同的事情,并使用原始二进制缓冲区写入文件,例如将原始二进制文件写入 .dll 格式.exe、.png 等
log_file.write(text, sizeof(text));
sizeof
是一个 编译时间常数 ,它给你大小 对象。 text
是一个 char *
,所以这给你总计 4 或 8,这取决于你编译的是 32 位还是 64 位二进制文件。 text
指向的只是几个字节,还是指向《哈利波特与死亡圣器》的全部内容都没有关系。 sizeof
总是会为您生成 4 或 8,无论 text
.
您需要在此处传递一个额外的参数,该参数来自存储数据的 std::vector
的 buffer.size()
,并在此处使用它。 sizeof()
是 而不是 与 std::vector
的方法“size
”相同。