Распаковщик бинарных контейнеров данных (C ++) - PullRequest
0 голосов
/ 02 августа 2020

Привет!

Я новичок в программировании на C ++, поэтому мне нужна «небольшая» помощь, чтобы распаковать / упаковать файл с именем packproject.opf, который является двоичным файлом .

У меня есть алгоритм сделать упаковщик / распаковщик.

Format Specifications
byte     {X}     - File Data

// DIRECTORY
uint32     {4}   - Number Of Files

// for each file

    char       {X}   - Filename

    byte       {1}   - null Filename Terminator
    uint32     {4}   - File offset
    uint32     {4}   - File Size
    
    uint32     {4}   - Directory Offset

Можете мне в этом помочь? Каковы первые шаги к созданию такой программы? Неужели это сложно сделать? Извините за плохой английский sh.

С нетерпением жду вашего положительного ответа.

МОЙ код:

#include <windows.h>
#include <string>
#include <iostream>
#include <fstream>
#include <iterator>
#include <filesystem>

using namespace std;


void listFiles(unsigned int curLine, string search, string filename, uint32_t NOF, uint32_t FileOffset, uint32_t FileSize, uint32_t DirectoryOffset) {
    //Show all .CBaseClass files stored in binary data container [.opf]

    curLine = 0;
    search = "CBaseClass";

    fstream myfile("PackedProject.OPF", ios::in | ios::out | ios::binary | ios::ate);
    myfile.open("PackedProject.opf");

    if (myfile.is_open()) {

        while (getline(myfile, filename)) {

            curLine++;
            if (filename.find(search, 0) != string::npos) {

                cout << "CBaseClass files:" << search << "Line:" << curLine << endl;

            }
        }
    }
}

int main(int argc, char** argv) {

    fstream myfile("PackedProject.OPF", ios::in | ios::out | ios::binary | ios::ate);
    if (!myfile) {

        cout << "Error\t! cannot read .OPF file!" << endl;
    }
    else {
        /*
        cout << "Reading .OPF binary data container" << endl;
        myfile.seekg(0, ios::end);
        int file_size = myfile.tellg();
        cout << "Filesize:\t" << file_size << "Bytes" << endl;
        */
        listFiles;



        system("PAUSE");
    }
}
...