考虑字符串“010010101
”。我想将上面的字符串以二进制格式存储在一个文件中。我想这样做,因为当我执行以下代码时:
ofstream out("file.txt");
out << string;
文件太大。我想通过在文件中以二进制格式存储0和1来减小文件大小。
答案 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;
}
请注意以下事项:
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);