C ++ Запись двоичного дампа и запись в двоичный файл из дампа

Я в тупике и мне нужна помощь.
В одной из моих программ я реализую некоторый код, чтобы я мог взять программу для Windows и, по сути, выполнить hexdump (то, что вы видите в шестнадцатеричных редакторах), где я преобразовал ее в двоичный файл и записал в документ .txt. Я только недавно получил эту половину. Другая половина кода предназначена для восстановления объекта, который был выгружен в двоичный файл в файле .txt, в исходный объект. Это должно работать для всех объектов в целом, а не только для восстановления одного определенного объекта.

Частичный код для сброса части:

//Rip Program to Binary

streampos size; //Declare size variable
unsigned char* memblock; //Holds input
ifstream input; //Declare ifstream
ofstream output("output.txt", ios::out|ios::binary); //Specify ofstream
input.open("sparktools.bin", ios::in|ios::binary|ios::ate); //Open input file and move to the end of it

size = input.tellg(); //Store current location as file length
memblock = new unsigned char [size]; //Declare the input holder with array size as length of file
input.seekg (0, ios::beg); //Return to beginning of file

input.read((char*)memblock, size); //Read each character of the input file until end of file

for (int i=0; i<size; i++) //For each character until end of file:
{
std::bitset<sizeof(char) * CHAR_BIT> binary(memblock[i]); //Set bitset<1> to essentially convert to a binary char array
output << binary; //Output from binary variable created
}

input.close();
output.close();
delete[] memblock;

Частичный код для восстановления части:

//Restore Ripped Binary To Program

int size; //Holds length of input document
unsigned char* memblock; //Holds input
ifstream input; //Declare ifstream
ofstream output("Binary.bin", ios::out|ios::binary); //Specify ofstream
input.open("Binary.txt", ios::in|ios::binary|ios::ate); //Open input file and move to the end of it

size = input.tellg(); //Store current location as file length
input.seekg(0, ios::beg); //Return to beginning of file
memblock = new unsigned char [size]; //Declare the input holder with array size as length of file
input.read((char*)memblock, size); //Read each character of the input file until end of file

for (int i=0; i<size; i++) //For each character until end of file:
{
output.write((char*) &memblock[i], size); //Write each char from the input array one at a time until end of file to the output binary

}

input.close();
output.close();
delete[] memblock;

Я проверяю возможности изображения. Исходный размер файла составляет 10 КБ. При выгрузке размер файла .txt составляет 76 КБ, а содержимое совпадает с тем, что отображается в шестнадцатеричном редакторе.

Когда я перестраиваюсь из двоичного дампа, размер файла не вернется к 10 КБ. Когда я увеличиваю число битов, размер файла увеличивается. Тем не менее, на бит<1> это остается в 76 КБ. Из моего заключения мне по сути нужно битсет <0,125>, чтобы уменьшить размер файла с 76 КБ до 10 КБ, и цифры должны совпадать, и его можно просто переименовать из .bin в .wh независимо от того, что было изначально, и работать правильно. Однако я не думаю, что битсет ниже 1.

Код, который я пробовал:

43555 KB: output.write((char*)&memblock[i], size);
0 KB: output.write((char*)memblock[i], size);
43555 KB: output.write((const char*)&memblock[i], size);
43555 KB: output.write(reinterpret_cast<const char*>(&memblock[i]), size);
43555 KB: output.write(reinterpret_cast<char*>(&memblock[i]), size);
76 KB: output << memblock[i];

Когда я делаю эти простые проверки:

cout << memblock[i];
cout << size;

Я вижу, что все входные данные были прочитаны и идентичны тому, что находится в файле. Переменная размера верна на 77296.

После некоторой догадки я думаю, что мне нужно что-то сделать с набором битов или вручную преобразовать биты обратно в байты, преобразовать, а затем передать это значение для достижения этой цели. Я на правильном пути или есть лучший / более легкий путь / что-то не так в моем коде? Заранее спасибо за помощь!

0

Решение

Насколько я могу судить, проблема заключается в порядке следования битов в дампе набора битов, дампе диска из первого фрагмента кода:

11001010

означает, что первый бит является самым значимым из байта, поэтому для декодирования этого вы должны сделать в цикле что-то вроде этого (проверено):

unsigned char *p = memblock;
//For each character until end of file:
for (int i=0; i<size/8; i++)
{
uint8_t byte = 0;
for (int j = 7; j >= 0; j--)
if (*p++ == '1')
byte |= (1 << j);

output.write((char*) &byte, 1);
}

Обратите внимание, что вы циклически изменяете размер / 8, поскольку каждые 8 ​​символов кодируют байт, и тот факт, что внутренний цикл выполняет итерацию от 7 до 0, чтобы отразить тот факт, что первый бит является более значимым.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]