以二进制形式读取文件,将其压缩并以二进制形式写回

Posted

技术标签:

【中文标题】以二进制形式读取文件,将其压缩并以二进制形式写回【英文标题】:Reading a file as binary, compressing and writing it back as binary 【发布时间】:2020-05-18 06:17:23 【问题描述】:

我们被分配在 C++ 中实现 Shannon Fano 压缩算法。虽然算法不是什么大问题,但我在将给定文件(txt、excel、BMP)作为二进制文件读取以进行压缩时遇到了一些麻烦。

教授。给了我们一些提示,但我不明白它们应该如何使用。他说我们应该制作一个包含文件路径的对象。然后它具有读取位、读取字节、读取整数和从二进制文件中读取浮点数的方法。虽然我知道 readBin 和 readByte 做了什么,但我不明白如何使用 readInt 或 readFloat 方法(fstream 如何知道下一个 char 是 int 或 float)。

有人知道如何使用我上面列出的方法实现二进制读取吗?谢谢!

【问题讨论】:

也许您应该读取几个字节并将它们解释为intfloat?但是,解释您的任务对于 SO 来说是题外话,请向您的教授寻求澄清。请向我们展示您的努力以及您遇到的问题。 【参考方案1】:

虽然我知道 readBin 和 readByte 做了什么,但我不明白如何使用 readInt 或 readFloat 方法(fstream 如何知道下一个 char 是 int 或 float)。

嗯,这个应用程序不需要任何这些。你只需要读入所有的二进制数据,压缩它,然后写出压缩的数据。使用解压缩而不是压缩的相同过程将反转该过程。

但要回答您的问题,请按以下步骤操作:

    准确定义每个字节在您的格式中的含义。例如,对于readInt,您可以选择使用四个字节来表示大端格式的有符号四字节整数。

    读取适当数量的字节。因此,对于一个四字节的readInt,您将读取四个字节。可能变成了char *

    根据您的格式将字节解析为您想要返回的任何类型。

    返回该值。

同样,你不需要为你的任务做任何这些。

【讨论】:

【参考方案2】:

除非您需要考虑不同文件(BMP、XLSX 等)的内部格式以提高压缩率,否则对于您的用例,我认为除了二进制流之外没有任何特殊理由将它们视为其他文件: 应用压缩算法的一堆字节。

我建议你看看这个答案,在那里你有一个关于如何在 C++ 中读取二进制文件的非常简单的例子:https://***.com/a/16435334/9390121

在内存中读取文件后,只需将其压缩并将其写回磁盘(即write() 而不是read())。

【讨论】:

【参考方案3】:

不确定是否有必要将整个文件读取为字节,但如果您需要 getInt() 或 getFloat(),请点击此处:

template<typename T>
T readType(std::ifstream& ifile)
    T result;
    ifile.read((char*)&result, sizeof(T));
    return result;

使用示例:

std::ifstream ifile("file.txt", std::ios::binary);
int i = readType<int>(ifile);

【讨论】:

以上是关于以二进制形式读取文件,将其压缩并以二进制形式写回的主要内容,如果未能解决你的问题,请参考以下文章

我应该在 SQL Server 上将盐存储为 varchar 还是 varbinary 并以十六进制形式存储?

在Qt中以二进制形式读取0和1文本文件[重复]

C++ 以二进制形式读取文本文件并在控制台中显示

将图像文件存储在猫鼬模式中的二进制数据中并以 html 形式显示图像

自制压缩软件

怎样把文件转换成二进制形式的文本文件?