Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有办法将字符串转换为二进制数据以减小大小?_C++_C++11_Binary_Compression_Binaryfiles - Fatal编程技术网

C++ 有没有办法将字符串转换为二进制数据以减小大小?

C++ 有没有办法将字符串转换为二进制数据以减小大小?,c++,c++11,binary,compression,binaryfiles,C++,C++11,Binary,Compression,Binaryfiles,我实现了哈夫曼编码(这是一项研究任务)。我得到一些文本字符串作为输入,并生成一些结果字符串,如:“011010 00101 0110 0101 0110 0101 0111 0000 0010 0000 0110 0010 0010 0110 0110 1111 0110 1111 0111 0000 0010 0000 0110 0010 0110 0101 0110 0110 0110 0110 0110 0110 0110 0110 0110 0000 0010 0110” 有没有办法将编

我实现了哈夫曼编码(这是一项研究任务)。我得到一些文本字符串作为输入,并生成一些结果字符串,如:“011010 00101 0110 0101 0110 0101 0111 0000 0010 0000 0110 0010 0010 0110 0110 1111 0110 1111 0111 0000 0010 0000 0110 0010 0110 0101 0110 0110 0110 0110 0110 0110 0110 0110 0110 0000 0010 0110”


有没有办法将编码的_字符串转换为二进制格式并写入文件?我的目标是减少输入数据的大小。但是,如果我将编码字符串写入文件,则文件会变得更大。

如果模式始终是4个字符和一个空格,则您可以将8个数字转换为字节->8位()的二进制值,您可能还需要一个标志,以指示最后4位数字实际上是4位还是8位。但是,我认为…

基于您关于空格不重要的评论,我将假设除0或1之外的任何内容都可以忽略。在这种情况下,您可以使用此函数将其写入文件流。请注意,最后一个八位字节将用零正确填充,因此如果输入的位数不能被8整除,您需要以某种方式对此进行解释,可能是将最后一个八位字节中的位数写到其他地方(可能在数据之后)

void write_位(std::ostream&output,std::string const&input)
{
无符号字符c;
整数位=0;
对于(自动i=output.begin();i!=output.end();++i){
如果(*i==“0”|*i==“1”){

c=(c因为您正在处理文本输入,即使使用文件,也可能有足够的内存来保存整个文件和ram中的编码数据。您可以选择直接将文本字符串编码到二进制缓冲区,然后创建一个函数,将二进制缓冲区中的哈夫曼代码转换为文本显示字符串,如o原始问题

在为二进制缓冲区分配空间时,假设最坏情况。例如,如果最长代码为12位,则最大位数将为12 x(n+1),四舍五入到某个方便的边界,其中n是文本文件中的字节数,+1用于数据代码的结尾


创建一个可以将文本文件编码为哈夫曼二进制文件的程序,以及另一个可以将哈夫曼文件解码为文本文件的程序可能会很有用。

您可以使用std::bitset吗?通常,您将位累积在一起,直到有一个完整的字节,然后将字节写入磁盘。当重新读取时,您读取整个字节每次,根据到达树中某个叶子的时间,计算当前位组中有多少位。最后,您可能需要添加一些填充以获得整个字节。@Niall,是的,我可以。但是我不知道如何使用位集来减少数据的大小。我会将字符串作为参数,因此您可以选择大小和大小他们说它有“to_ulong”返回您可以写入文件的整数。在内部,它通常被要求作为整数或整数数组。@尼尔,我输入了一个错误。只有0、1和空格。不幸的是,模式并不总是4。这是我的一个坏例子。字符串的leagle字符是什么?0-1和空格是字符串的leagle字符。o不应该吗输出行be:输出注意,哈夫曼编码应该包含一个数据代码结尾的位模式,这样,由于填充到字节(或其他)边界,数据代码结尾之后的任何位都将被忽略。@rcgldr确实应该这样做。@cdhowie,感谢您的示例。
string some_text = read_text_file_to_string(text_file);

string coded_string = encode_string(some_text); // coded_string == "011010 00101 0110 0101..."
void write_bits(std::ostream & output, std::string const & input)
{
    unsigned char c;
    int bits = 0;

    for (auto i = output.begin(); i != output.end(); ++i) {
        if (*i == '0' || *i == '1') {
            c = (c << 2);
            if (*i == '1') {
                ++c;
            }

            if (++bits == 8) {
                output << c;
                c = 0;
                bits = 0;
            }
        }
    }

    if (bits > 0) {
        while (bits < 8) {
            c <<= 2;
            ++bits;
        }
        output << c;
    }
}