c# - 在字符串中使用二进制数据时数据是否“丢失”?

时间:2008-10-28 08:43:53

标签: c# string

我尝试使用StreamReaderReadToEnd()方法读取JPG文件,该方法返回一个字符串。

出于某种原因,当我将此字符串写入文件时,它不会打开。

将数据读入字符串时是否会丢失某些内容?

9 个答案:

答案 0 :(得分:25)

字符串用于 text 数据。它们不是二进制数据 - 如果您以这种方式使用它们丢失数据(如果您幸运的话,您可以使用不会丢失数据的编码,但有一些细微的问题,仍然是一个非常糟糕的主意。)

如果您实际处理文件,最简单的方法是阅读File.ReadAllBytes。如果您必须处理任意流,请查看"Creating a byte array from a stream"

答案 1 :(得分:5)

正如所有真正的程序员都知道的那样,唯一有用的数据结构是Array。字符串,列表,结构,集合 - 这些都是数组的特殊情况,可以这样轻松地处理,而不会弄乱您的编程语言中的各种复杂情况。花哨的数据类型最糟糕的是你必须声明它们,而且我们都知道,Real Programming Languages根据(六个字符)变量名的第一个字母进行隐式类型化。

此外,确定的Real Programmer可以用任何语言编写Fortran程序。


无论是谁修改了这个,都要么没有幽默感,要么没有民间传说知识。以上内容摘自1983年由泰克的Ed Post撰写的一篇非常着名的致Datamation编辑的信。这封信的标题是 Real Programmers Don't Use Pascal

答案 2 :(得分:5)

永远记住,文本数据 二进制数据二进制数据 > 文本数据

答案 3 :(得分:4)

String用于保存unicode字符;不是二元的。对于二进制文件,请使用byte[]Stream。或Image等更专业的图像处理。

尽管有名称,但StreamReader实际上是一个专门的TextReader - 即TextReaderStream读取。图像不是文本,因此这不是正确的选项。

答案 4 :(得分:1)

不幸的是,System.IO命名空间中的类名存在严重问题。 StreamReader旨在读取\写入\到文本文件。你应该使用FileStream作为@goodwill建议的二进制文件

答案 5 :(得分:0)

你不能这样做....改为使用FileStream。

你不能使用字符串来读取二进制文件,据我所知,有些字符不会成功。

答案 6 :(得分:0)

字符串用于表示文本。他们善于表达文本。事实上,非常好,因为它们支持Unicode并保护您免受各种典型的字符串处理错误。

他们不擅长表示二进制数据,因为这不是他们的设计目标。如你所述,字节数组要好得多。

这不是一个比另一个好的问题,它只是适合目的和理解何时选择其中一个。 Text = string,binary = byte array或stream。

答案 7 :(得分:0)

我注意到没有人回答实际问题。

将数据读入字符串时会丢失什么?

JPEG文件包含图片而不是文字。该bicture具有二进制表示作为字节序列。其中一些字节的值0x00也表示为NUL。在字符串中,包含此值的字节被解释为标记字符串的结尾。超过字符串结尾的数据被视为未使用的缓冲区,并被忽略。

当您将字符串写入文件时,不包括第一个NUL之外的任何内容。因此,该文件不是一个完整的二进制图像,并被软件的验证逻辑拒绝,试图将其解释为JPEG。

因此,当您加载包含非文本数据的字符串时,数据通常 会丢失。这里的问题是您已经有效地进行了无效的类型转换,但是编译器和运行时都没有阻止您,结果是数据损坏。

它真正有用吗?

好几件事。正如其他人所说,字符串旨在包含文本。在.NET中,字符串支持除普通旧ASCII之外的编码。对文本操作也有广泛的支持。在帮助中查找格式说明符,以获得字符串操作的壮观示例。

为什么C#字符串使用NUL作为字符串结尾?

这是遗产。 NUL对其他任何东西都不是很好,这样做简化了在托管代码中编组和编写字符串的操作。出于同样的原因,BSTR做同样的事情。

答案 8 :(得分:0)

字符串默认使用Unicode编码,unicode使用NUL字符作为控制字符,双NUL用于终止,单个NUL用于表示之前的ASCII字符。

由于这个原因,二进制数据无法加载到字符串中。