У меня есть строка, состоящая из 0 и 1. Как мне сохранить эти 0 и 1 в двоичном формате в файле?

Рассмотрим строку «010010101Msgstr «Я хотел бы сохранить вышеуказанную строку в двоичном формате в файле. Я хочу сделать это, потому что, когда я выполняю следующий код:

    ofstream out("file.txt");
out << string;

размер файла слишком велик. Я хотел бы уменьшить размер файла, храня 0 и 1 в двоичном формате в файле.

0

Решение

Вы можете записать байты в файл

например

#include <fstream>
...
char buffer[100];
ofstream myFile ("data.bin", ios::out | ios::binary);
myFile.write (buffer, 100);

Теперь мы теперь, как писать байты, все, что нам нужно знать, это как преобразовать нашу строку в значения байтов, которые будут записаны.

Предполагая, что ваша строка не закодирована в Unicode, мы можем просто использовать таблицу ascii, чтобы узнать, что «1» представляет числовое значение 49, а «0» представляет числовое значение 48.

Обладая этими знаниями, вы можете выполнять итерацию через каждые 8 ​​символов вашей строки, вычитая 48 из каждого «1» или «0», вы получите числовое значение. Затем сдвиньте 8 чисел, пока не получите свой байт. Если у вас менее 8 символов, вам нужно поставить ведущие нули.

Мне было лень писать код, но я предполагаю, что с этими знаниями вы сможете написать хороший рабочий алгоритм.

3

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

Просто используйте эту функцию, чтобы превратить строку '0' а также '1' символы в упакованную двоичную строку:

string pack_bin (string const & s)
{
string ret;
ret.reserve ((s.size() + 7) / 8);

for (unsigned i = 0; i < s.size(); )
{
char c = 0;
for (unsigned j = 0; j < 8; ++j, ++i)
c = (c << 1) | ((s[i] != '0') ? 1 : 0);
ret += c;
}

return ret;
}

и наоборот:

string unpack_bin (string const & s)
{
string ret;
ret.reserve (s.size() * 8);

for (unsigned i = 0; i < s.size(); ++i)
for (int j = 7; j >= 0; --j)
ret += ((s[i] & (1 << j)) ? '1' : '0');

return ret;
}

Обратите внимание на следующее:

  • Если длина строки не кратна 8, вы должны сохранить длину в результирующей строке, чтобы иметь возможность восстановить именно ту строку, которая была у вас. В противном случае распакованная строка будет иметь дополнительные нули в конце.
  • Лучше записать полученную строку в двоичный файл, т.е. ofstream out("file.txt", ios:binary);

Вы можете использовать вышеуказанные процедуры, как это:

// To write:
ofstream out ("file.txt", ios::binary);
out << pack_bin(str);

// To read back:
ifstream in ("file.txt", ios::binary);
string s;
in >> s;
s = unpack_bin (s);
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector