首页 > 解决方案 > 从linux上的char缓冲区写入二进制文件

问题描述

所以我是 C++ 上 linux 编程的新手,我正在尝试将二进制文件(.dll、.exe 等)的内容写入 .txt 以测试并查看操作结果,代码工作并写入 . txt 文件和一些二进制文件,但是当我打开 .txt 文件时,里面没有写入完整的二进制文件,问题是由于我知道的无效 unicode。

这是一个屏幕截图,以便更好地理解:

单击此处查看来自 stackoverflow 的图像

或者

打开 .txt 文件时的文本输出:

MZ\90\00\00\00\00\00

这是我正在使用的代码(可重现的示例):

#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 等。

标签: c++linuxbinarybufferraw

解决方案


log_file.write(text, sizeof(text));

sizeof是一个编译时间常数,它为您提供对象的大小。 text是 a char *,所以这会给你总共 4 或 8 个,这取决于你编译的是 32 位还是 64 位二进制文​​件。text指向只是几个字节,还是“哈利波特与死亡圣器”的全部内容都没有关系。这sizeof将始终为您生成 4 或 8,无论text.

您需要在此处传递来自数据存储位置的附加参数,并在此处使用该buffer.size()参数。与称为“ ”的方法不同std::vectorsizeof()std::vectorsize


推荐阅读