我有一个由0和1组成的字符串。如何将二进制格式的0和1存储在文件中?

时间:2014-04-25 12:54:45

标签: c++ string file bits

考虑字符串“010010101”。我想将上面的字符串以二进制格式存储在一个文件中。我想这样做,因为当我执行以下代码时:

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

文件太大。我想通过在文件中以二进制格式存储0和1来减小文件大小。

2 个答案:

答案 0 :(得分:3)

您可以将字节写入文件

e.g。

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

现在我们现在如何编写字节,我们需要知道的是如何将字符串转换为要写入的字节值。

假设你的字符串没有以unicode编码,我们可以简单地使用ascii表来找出&#39; 1&#39;表示数值49和&#39; 0&#39;代表数值48。

有了这些知识,你可以通过字符串的每8个字符进行迭代,从每个字符中减去48个字符。或者&#39; 0&#39; 0会给你数值。比你把8个数字移到一起,直到你有你的字节。如果你的角色少于8个,则需要设置前导零。

我懒得写出代码,但我想用这些知识你应该能够编写一个很好的工作算法。

答案 1 :(得分:0)

只需使用此函数将'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);