为什么二进制数据写入的结果是字符串?

时间:2012-09-11 13:02:56

标签: c#

我想创建一个二进制文件并在其中存储字符串数据,我使用了这个示例:

FileStream fs = new FileStream("c:\\test.data", FileMode.Create);
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(Encoding.ASCII.GetBytes("david stein"));
bw.Close();

但是当我在记事本中通过此示例(test.data)打开创建的文件时,它中包含字符串数据(“david stein”),现在我的问题是这个二进制写入和文本写入之间的区别是什么结果是字符串?

我想在二进制文件中创建数据,直到用户无法通过记事本打开和读取我的数据,如果用户在记事本中打开它,请查看真实的二进制数据。

在某些文件中,当您在文本编辑器中打开主题时,您无法读取文件内容,如jpg文件内容,它们不使用任何加密方法,那么它怎么样?我怎么能像这样使用我的数据?

2 个答案:

答案 0 :(得分:8)

  

现在我的问题是,当结果是字符串时,这个二进制写和文本写的区别是什么?

文件中的数据始终是“字节序列”。在这种情况下,您编写的字节序列是“ASCII编码中表示文本'david stein'的字节”。所以是的,如果你在任何试图以与ASCII兼容的方式解释字节作为文本的编辑器中打开文件,你会看到文本“david stein”。实际上它只是一个字节的负载 - 这完全取决于你如何解释它们。

如果你写了:

File.WriteAllText("c:\\test.data", "david stein", Encoding.ASCII);

你最终会得到完全相同的字节序列。您可以通过多种方式创建具有相同字节的文件。File.WriteAllText没有任何内容将文件“标记”为文本,并且FileStreamBinaryWriter没有任何内容它将文件标记为二进制文件。

编辑:来自评论:

  

我想在二进制文件中创建数据,直到用户无法通过记事本打开和读取我的数据

嗯,有很多方法可以实现不同级别的安全性。理想情况下,您需要某种加密 - 但是代码读取数据也需要能够解密它,这意味着它需要能够获得密钥。然后将问题转移到“我如何存储密钥”。

如果您只需要验证文件中的数据(例如,检查它是否与其他地方的内容相匹配),那么您可以改为使用cryptographic hash

如果您只需要防止最随意的窥探者,您可以使用基本上只是混淆的东西 - 一种非常弱的加密形式,没有“密钥”本身。任何编写代码的人都很容易在这种情况下获取数据,但你可能不会太在意这一点。

这完全取决于您的要求。

答案 1 :(得分:1)

所有数据都是二进制的。文本文件是二进制数据,恰好是表示有效字符的有限子集,但它仍然是二进制的。

文本编辑器通常将文本文件与二进制文件区分开来的方式是它们将文件的某个部分扫描为零值\0。它们从不存在于纯文本文件中,几乎总是存在于二进制文件中。