Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.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++ 读取和哈夫曼压缩4字节二进制字符串STD C++;Linux环境_C++_Linux_Binary_Compression_Huffman Code - Fatal编程技术网

C++ 读取和哈夫曼压缩4字节二进制字符串STD C++;Linux环境

C++ 读取和哈夫曼压缩4字节二进制字符串STD C++;Linux环境,c++,linux,binary,compression,huffman-code,C++,Linux,Binary,Compression,Huffman Code,我正在为哈夫曼编码做一些家庭作业。我已经完成了哈夫曼算法,但需要稍微修改它以处理二进制文件。我花了一些时间阅读相关的问题,可能是因为我对数据类型和二进制文件缺乏了解,我仍然有点挣扎,所以希望我不会重复前面的问题(我不会发布与程序的huffman部分相关的代码) 这里是关键短语:“你可以假设每个符号,它将被映射到一个码字,是一个4字节的二进制字符串。”,我想我知道的是Char代表一个字节,unsigned int代表四个字节,所以我猜我应该一次将输入的四个字节读入一个无符号int缓冲区,然后为程序

我正在为哈夫曼编码做一些家庭作业。我已经完成了哈夫曼算法,但需要稍微修改它以处理二进制文件。我花了一些时间阅读相关的问题,可能是因为我对数据类型和二进制文件缺乏了解,我仍然有点挣扎,所以希望我不会重复前面的问题(我不会发布与程序的huffman部分相关的代码)

这里是关键短语:“你可以假设每个符号,它将被映射到一个码字,是一个4字节的二进制字符串。”,我想我知道的是Char代表一个字节,unsigned int代表四个字节,所以我猜我应该一次将输入的四个字节读入一个无符号int缓冲区,然后为程序的Huffman部分收集数据

int main() {
    unsigned int buffer;
    fstream input;
    input.open("test.txt", ios::in | ios::binary);


    while(input) {
        input.read(reinterpret_cast<char *>(&buffer), 4);
        //if buffer does not exist as unique symbol in collection of data add it
        //if buffer exists update statistics of symbol
    }
    input.close();
}
intmain(){
无符号整数缓冲区;
流输入;
open(“test.txt”,ios::in | ios::binary);
while(输入){
输入读取(重新解释转换和缓冲区),4);
//若缓冲区在数据集合中不作为唯一符号存在,则添加它
//如果存在缓冲区,则更新符号的统计信息
}
input.close();
}
这看起来是处理数据的好方法吗?如果只剩下1、2或3个字节,我应该如何处理文件的结尾?所以我只是将缓冲区存储为结构中的无符号int。只是出于好奇,我该如何将缓冲区重铸为字符串?
编辑:存储哈夫曼压缩文件头的最佳方式是什么

这看起来是处理数据的好方法吗

我建议使用
int
char[4]
union
并按您应该的方式将指针传递到
char
数组,而不是投射指针。不知道其余的逻辑是什么,所以不能说实际的处理(不在您发布的代码中)是否以良好的方式完成,但在我看来,这似乎相当琐碎

如果只剩下1、2或3个字节,我应该如何处理文件的结尾

假设每个符号都有4个字节长,我认为这不是一个有效的输入

所以我只是将缓冲区存储为结构中的无符号int。出于好奇,我该如何将缓冲区重铸为字符串


你为什么要那样做?在数据中,“字符”是4字节。但是,如果您愿意,您可以使用强制转换到字节数组(或者,更好的方法是,如果顺序重要的话,使用逐位操作来提取实际字节)。

+1,我会给出相同的答案。然而,我仍然不确定
联合
是否保证总是按照特定顺序匹配
int
char[4]
。好吧,这是有道理的,有一点我不明白,我正在等待TA的响应,那就是为什么是4字节?因为他们没有提供任何测试数据,他们说你只需要用和pdf、文件等进行测试,但是如果大小不能被4整除,那么它就不起作用了,对吗?或者我遗漏了什么?事实上与我想象的略有不同,TA希望我们将它们分组为4个字节,但如果最后一个是1、2或3个字节,那么仍然要处理它,因为它应被视为有效输入。@MCH:如果您有未对齐的输入,那么您需要找到一种方法来记住总大小,然后将其对齐并添加到树中。解压时-基于总大小,转储最后多余的字节。