2

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

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 文件内容等文件内容,它们不使用任何加密方法,那又如何?我怎么能这样写我的数据?

4

2 回答 2

8

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

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

如果你写:

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

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

编辑:来自评论:

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

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

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

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

这一切都取决于您的要求。

于 2012-09-11T13:06:33.627 回答
1

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

文本编辑器通常区分文本文件和二进制文件的方式是他们扫描文件的某个部分以查找零值,\0. 这些从不存在于纯文本文件中,几乎总是存在于二进制文件中。

于 2012-09-11T13:07:35.833 回答