以二进制形式读取文件,将其压缩并以二进制形式写回
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)。
有人知道如何使用我上面列出的方法实现二进制读取吗?谢谢!
【问题讨论】:
也许您应该读取几个字节并将它们解释为int
或float
?但是,解释您的任务对于 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 并以十六进制形式存储?