Как читать любые файлы в двоичном виде и редактировать их как угодно (например, сжать) с помощью c ++? - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь найти способ манипулирования двоичным кодом любого файла на компьютере, чтобы применить алгоритм сжатия / распаковки в c ++. Я искал об этом в течение долгого времени, и все, что я нашел, это как читать файл .bin:

#include <iostream>
#include <fstream>
using namespace std;

int main (){
streampos size;
char * memblock;

ifstream file ("name.bin", ios::in|ios::binary|ios::ate);
if (file.is_open())
{
size = file.tellg();
memblock = new char[size];
file.seekg (0, ios::beg);
file.read (memblock, size);

for(int i = 0 ; i < size ; i++){

    cout << memblock[i] ;

}

file.close();

cout << "\n\n the entire file content is in memory";

delete[] memblock;
}
else cout << "Unable to open file";
return 0;

}

Я просто хочу эти байты без перевода ASCII, другими словами, я хочу, чтобы весь файл как двоичный не что внутри

Ответы [ 2 ]

2 голосов
/ 12 марта 2020

<< перегружен для char типов для вывода форматированного символа ASCII. Данные (единицы и нули) в вашем массиве memblock точно считываются в двоичном виде. Это просто способ их отображения, который является ASCII. Вместо char[] для memblock, сделайте его uint8_t[]. Затем при выводе выполните

std::cout << std::hex << std::fill('0') << std::setw(2) << memblock[i];
             ^           ^                 ^
             |           |                 |
             |           |            sets the width of the next output
             |        sets the fill character (default is space)
          tells the stream to output all numbers in hexadecimal

. Вам потребуется #include <iomanip>, чтобы манипуляторы формата потока hex, fill и setw работали.

Обратите внимание, что setw будет установлен в потоке только для следующей операции вывода, в то время как hex и fill будут установлены до тех пор, пока не будет явно задано иное. Тем не менее, вам нужно установить эти два манипулятора только один раз, вероятно, за пределами вашего l oop. Затем, когда вы закончите, вы можете установить их обратно как:

std::cout << std::dec << std::fill(' ');

См. https://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt2 для списка перегруженных operator<< функций для char и char массивы.

0 голосов
/ 22 марта 2020

Ответ был проще, чем мы думали:

включает набор битов

for(int i = 0 ; i < size ; i++){

//changing the value of "memblock[i]" to binary byte per byte with for loop
//and of course using bitset

bitset<8> test (memblock[i]);
cout << test ;

}
...