写入文本文件,二进制与 ascii

Posted

技术标签:

【中文标题】写入文本文件,二进制与 ascii【英文标题】:Writing to a text file, binary vs ascii 【发布时间】:2014-04-26 01:13:13 【问题描述】:

所以我很难理解这个概念。我有一个程序可以读取一个文本文件,并将其写入另一个文件,并用无符号字符替换最常用的单词。但是我一生无法理解的是,我如何确定两者之间的区别。

如果我将我读入的原始字符或对应于 1-255 的无符号字符值写入新文件,那么当我返回到原始文件内容时如何确定差异?

【问题讨论】:

给出一个示例输入和你想要的相应输出。从您的帖子中,很难确定您要做什么。一个示例将为答案提供参考,并帮助他们解决您可能遇到的任何困惑。 “用无符号字符替换最常用的单词”是什么意思? 'with unsigned chars' 你的意思是原始二进制数据与人类可读文本,对吗? 我的意思是我一次在文本文件中读取一个字符,如果该单词或标点符号或空格对应于密钥库中的某些内容,则它将该标点符号空格或单词替换为unsigned char 表示 1-255 个最常用单词的列表。但是我遇到的困难是当我回去尝试从这个压缩文件转到原始文件时。我如何确定我是否正在阅读其中一个无符号字符而不是单词中的一个字符。 【参考方案1】:

当您将文件写入二进制文件时,使用 2 或 4 个字节写入诸如“1253553”之类的数字(取决于平台上int 的大小)。因此,在二进制文件中,您将看到代表该数字的 2 或 4 个字节的序列。对于chars,它应该没有区别,因为每个char 都用一个字节表示。

【讨论】:

【参考方案2】:

通常,您必须有一些众所周知且显而易见的方法来确定文件的格式。

一种方法是创建您自己的文件扩展名。您可以天真地期望任何具有该扩展名的文件都是您的压缩格式,但实际上其他文件很可能具有相同的扩展名(例如,“.dat”可能是一个糟糕的选择)。因此,您需要采取进一步的措施,例如让文件的前几个字节成为任何其他文件中不太可能存在的内容(一些“幻数”)。让我们使用两个字节,让我们简单地选择 0xAB 0xCD 作为这两个字节。

因此,当您的程序出现具有适当扩展名的文件时,请打开它并读取前两个字节。如果它们是 0xAB 和 0xCD,您可以假设您正在阅读您的特殊格式。

这不是完成这项任务的一种非常有效的方法,但它是一种方法。如果你愿意,你可以变得更奢侈。

有关更多信息,您可能需要阅读the Wikipedia page on the subject。这是一个开始。

【讨论】:

我对压缩版本使用了不同的文件类型。但是压缩文件没有完全压缩,只是部分压缩。压缩的部分被压缩为无符号字符字节,范围为 1-255,因为这是列表中要压缩的字数。如果字符不被压缩,它只是作为我从原始文件中读取的字符添加。 是的,而且?就像您在问题中所说的那样,您需要一种方法来识别文件是否采用这种格式。我给了你一些选择,还有其他的,但你需要想出一些方法。是否有任何其他软件应该能够读取您的压缩文件?人类应该能够阅读它吗?也许只需在文件的开头添加一个关键字(就像***页面说 .gif 文件在开头使用 GIF87a 一样)。 问题不在于确定我想要的文件,我已经根据文件的扩展名将其内置到其中。我的问题是,当我阅读此文件时,如何确定该字符是我根据我的密钥列表添加的未签名字符之一,还是直接从原始文件写入文件的字符之一。这是一个压缩/解压缩应用程序。 在您的特殊字符前面加上一个空字符 (0),并确保 0 永远不会出现在其他任何地方。那么当你遇到它时,你就知道下一个是“特殊的”。 难道没有另一种方法不会为文件添加更多内存吗?我有一个朋友试图向我解释将变量与 0 进行比较可以解决问题,但我在测试程序中尝试过,但没有成功。关于查看 ASCII 文本或十进制值。

以上是关于写入文本文件,二进制与 ascii的主要内容,如果未能解决你的问题,请参考以下文章

java输入与输出

Python——文件读取与写入

C++ 二进制文件 & 顺序读写

文本文件与二进制文件

请问啥是二进制文件 啥是ASCII 啥是文本文件 它们之间有啥区别

文本文件与二进制文件