Search code examples
c++linuxbinarybufferraw

Write Binary file from char buffer on linux


So i am new to linux programming on C++ and i am trying to write the contents of a binary file (.dll, .exe etc) to a .txt to test and see the results of the operation, the code works and writes the .txt file and some of the binary into it, but when i open the .txt file there is not the full binary writed inside and the problem is due invalid unicode from far i know.

Here is a screenshot for better understanding:

Click here to see image from stackoverflow

or

Text Output when open the .txt file:

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

And here is the code i am using (reproducible example):

#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());
}

Any help is apreciated, i am trying to do exactly the same than file_get_contents of php and whit the raw binary buffer write the file, for example write the raw binary to .dll format .exe, .png etc etc.


Solution

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

    sizeof is a compile time constant that gives you the size of the object. text is a char *, so this gives you a grand total of 4 or 8, depending on whether you compiled a 32bit or a 64bit binary. It doesn't matter whether text points to just a few bytes, or the entire contents of "Harry Potter And The Deathly Hallows". This sizeof will always produce either a 4 or an 8 for you, no matter what's in text.

    You need to pass an additional parameter here that comes from the buffer.size() of the std::vector where the data is stored, and use that here. sizeof() is not the same thing as a method of std::vector that's called "size".