C++ 编码比原始文本更大:如何获取由0和1组成的字符串,并将它们作为实际字节写入文件
我在C++ 编码比原始文本更大:如何获取由0和1组成的字符串,并将它们作为实际字节写入文件,c++,encoding,compression,C++,Encoding,Compression,我在C++中有一个LZ77(滑动窗口)的实现,它能够成功地获取一个文件,并将0s1输出和编码到另一个文件。唯一的问题是输出文件比原始文件大 我发现这是因为我使用字符串来表示位字符串,并将这些字符串写入文件 我想知道如何将这些零一的字符串标记以字节的形式写入文件以节省空间。最后,我想到了这个 unsigned char str_to_byte(std::string s){ std::bitset<8> b(s); return static_cast<u
C++
中有一个LZ77(滑动窗口)的实现,它能够成功地获取一个文件,并将0s1输出和编码到另一个文件。唯一的问题是输出文件比原始文件大
我发现这是因为我使用字符串来表示位字符串,并将这些字符串写入文件
我想知道如何将这些零一的字符串标记以字节的形式写入文件以节省空间。最后,我想到了这个
unsigned char str_to_byte(std::string s){
std::bitset<8> b(s);
return static_cast<unsigned char> (b.to_ulong());
}
void write(std::string s,std::ostream& out)
{
size_t len = s.length();
std::string tstring;
unsigned char c;
if (len < 8){
tstring = pad_string(s, 8);
c = str_to_byte(tstring);
//std::cout << tstring << std::endl;
out << c;
return;
}
size_t i = 0 ;
for (; i < len; i+=8){
tstring = s.substr(i,8);
//std::cout << tstring << std::endl;
c = str_to_byte(tstring);
out << c;
}
if (i != len){
i = i-8;
tstring = pad_string(s.substr(i,8),8);
//std::cout << tstring << std::endl;
c = str_to_byte(tstring);
out << c;
}
}
unsigned char str_to_byte(std::string s){
std::位集b(s);
返回静态_cast(b.到_ulong());
}
无效写入(标准::字符串s,标准::ostream&out)
{
尺寸长度=s.长度();
std::字符串tstring;
无符号字符c;
if(len<8){
t字符串=pad_字符串(s,8);
c=str_到_字节(tstring);
//std::难道大多数语言都有逐位运算符来处理位,允许您设置、清除或切换整数值上的任意位。首先,停止使用字符串存储二进制数据。然后,您就不必做任何事情来解决您在尝试使用字符串处理二进制数据时产生的问题。而且不会出现“”其次,“:-)(如果您通过将二进制文件转换为字符串来破坏文件,并且最终得到的文件与源文件中的文件不同,那么您没有成功完成任何操作。)@肯怀特:是的,这可能是一个糟糕的设计选择。但在这一点上,我坚持认为我能做些什么?我从来没有说过我要将二进制转换为字符串。你已经将一位(0或1)转换为8位(0或1)。这需要一些工作。您需要进行大量的位移位和切换,以修复文件的每个字节(将32个字符转换为32位)。。