将二进制转换为C-Style数组存储到char数组中

时间:2018-10-10 18:47:58

标签: arrays vector char ifstream stdstring

我使用一种方法来读取文件并打开它。该方法以一个数组作为参数,该数组对应于转换为C数组的文件。我可以像这样创建此数组:

unsigned char dataArray[24] = {
    0x4D, 0x5A, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
    0xFF, 0xFF, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

如果我使用此数组调用方法,它将起作用。由于下面的代码,我在output.txt文件中获得了C-Style代码。 我现在想选择一个文件,读取它并动态填充我的dataArray,而无需在.txt上编写C-Style并将其复制/粘贴到源代码中。我知道生成的C-Style是正确的,因为我可以将其直接放在源代码中并且可以工作。问题是如果我要填充dataArray并直接用它调用它,则无法读取该文件。字节可能已损坏或未正确填充到数组中。 我不知道我的代码有什么问题。 希望你能帮助我。

#include "pch.h"
#include <fstream>
#include <iostream> // Standard C++ library for console I/O
#include <string> // Standard C++ Library for string manip
#include <Windows.h> // WinAPI Header
#include <TlHelp32.h> //WinAPI Process API
#include <stdio.h>
#include <assert.h>
#include <sstream>
#include <vector>
#include <iomanip>
#include <bitset>
#include <cstdlib>
#include <iterator>
#include <memory>
#include <cstring>



void readFile(std::string p_path, unsigned char* p_dataArray[]);

unsigned char * dataArray[1];

int main()
{

    std::string path = "The\\Path\\To\\My.exe";
    readFile(path,dataArray);
}

void readFile(std::string p_path, unsigned char* p_dataArray[])
{
    std::ifstream input{ p_path, std::ios::binary };
    if (!input.is_open()) {
        std::cout << "Error: Couldn't open\"" << p_path << "\" for reading!\n\n";
    }

    // read the file into a vector
    std::vector<unsigned char> data{ std::istream_iterator<unsigned char>{ input },
                                     std::istream_iterator<unsigned char>{} };

    std::ostringstream oss;  // use a stringstream to format the data

    int columnCounter = 0;
    for (int i = 0; i < data.size(); i++)
    {
        columnCounter++;
        if (columnCounter == 8) {
            columnCounter = 0;
            oss << " " << std::endl;
        }
        if (i == i - 1)
        {
            oss << '0'
                << 'x'
                << std::setfill('0') << std::setw(2) << std::uppercase << std::hex << static_cast<int>(data.at(i));
        }
        else
        {
            oss << '0'
                << 'x'
                << std::setfill('0') << std::setw(2) << std::uppercase << std::hex << static_cast<int>(data.at(i)) << ',';
        }

    }

    // create a unique_ptr and allocate memory large enough to hold the string:
    std::unique_ptr<unsigned char[]> memblock{ new unsigned char[oss.str().length() + 1] };

    // copy the content of the stringstream:
    int r = strcpy_s(reinterpret_cast<char*>(memblock.get()), oss.str().length() + 1, oss.str().c_str());

    std::ofstream myfile;
    myfile.open("output.txt");
    myfile << oss.str();
    myfile.close();


    readMyFile(memblock.get());
}

0 个答案:

没有答案