几天前,我要求 为什么它不能够储存二进制数据,例如jpg文件变成一串.

大多数的答案我说的字符串中使用文本信息,例如什么,我写了。

什么是考虑文本的数据吗?字节的一个定性表示jpg文件和那些字可能表示的字符字节的价值观,我认为。因此,当我们说串用文本信息,是否有某种范围或列表中的字符,并不存储?

对不起,如果这个问题听起来很傻。只是试图'得到它

有帮助吗?

解决方案

我发现将二进制数据存储在字符串中存在三个主要问题:

  1. 大多数系统在字符串变量中假定某种编码 - 例如如果它是UTF-8,UTF-16或ASCII字符串。新行字符也可能会根据您的系统进行翻译。
  2. 你应该注意字符串大小的限制。
  3. 如果使用C样式字符串,则数据中的每个空字符都将终止字符串,并且执行的任何字符串操作仅适用于第一个空字节的字节。
  4. 也许是最重要的:它令人困惑 - 其他开发人员不希望在字符串变量中找到随机二进制数据。在遇到二进制数据时,许多上运行的代码也可能会变得非常困惑:)

其他提示

我更希望将二进制数据存储为二进制数据,你只考虑在没有其他选择的情况下将其转换为文本,因为当你将它转换为文本表示时,它确实浪费了一些字节(不多,但仍然很重要) ,这就是他们如何将附件放入电子邮件中。

Base64 是二进制文件的良好文字表示。

我认为您指的是二进制文本编码问题。 (将jpg翻译成字符串将需要那种预处理)

事实上,在那篇文章中,一些字符被提及并不总是受支持,其他字符可能会令人困惑:

  

有些系统可以处理更有限的字符集;它们不仅不是8位干净,有些甚至无法处理每个可打印的ASCII字符。
  其他人对换行符之间可能出现的字符数有限制   还有一些人在文本中添加标题或预告片。

     

一些未被充分考虑但仍在使用的协议使用带内信令,如果消息中出现特定模式,则会造成混淆。最着名的是字符串“From”。 (包括尾随空格)在用于分隔mbox文件格式的邮件消息的行的开头。

谁告诉你你不能把'二进制'数据放入字符串中是错误的。字符串只是表示您最有可能计划用于文本数据的字节数组......但没有什么可以阻止您将任何数据放在您想要的位置。

我必须要小心,因为我不知道你使用的语言是什么......在某些语言中\ 0结束了字符串。

在C#中,您可以将任何数据放入字符串中......例如:

byte[] myJpegByteArray = GetBytesFromSomeImage();

string myString = Encoding.ASCII.GetString(myJpegByteArray);

之前,国际化,它并没有太大的差别。ASCII字都是字节,因此串,字阵列和字节的数组结束了具有相同的实施。

这些天来,虽然串是一个复杂得多,为了处理与成千上万的外字的语言和语言的规则。

当然,如果你看起来不够深入,一切都只是位和字节,但有一个不同的世界在计算机如何解释它们。该规则为"文本"使事情看起来正确的,当它就显示到一个人,但计算机是免费的猴子内部的表示。例如,

内心深处一切都只是字节。 像字符串和图片之类的东西是由关于如何排序字节的规则定义的。 例如,字符串以值为32(或其他)的字节结尾 jpg没有

取决于语言。例如,在Python中,字符串类型(str)实际上是字节数组,因此它们确实可以用于二进制数据。

在C中,NULL字节用于字符串终止,因此sting不能用于任意二进制数据,因为二进制数据可能包含空字节。

在C#中,字符串是一个字符数组,由于char基本上是16bit int的别名,因此您可以放弃将任意二进制数据存储在字符串中。当您尝试显示字符串时可能会出现错误(因为某些值可能实际上不对应于合法的unicode字符),并且某些操作(如大小写转换)可能会以奇怪的方式失败。

简而言之,在某些语言中可能有可能将任意二进制数据存储在字符串中,但它们并非设计用于此用途,并且您可能会遇到各种不可预见的问题。大多数语言都有一个字节数组类型,用于存储任意二进制数据。

我同意 Jacobus' 回答:在结束所有的数据结构是由字节。(嗯,如果你去甚至更深:的位)。有些抽象,可以说,一串或一个字阵列公约的程序员,在如何对它们进行访问。

在这方面,串是一个抽象的数据解释为一种文本。文字的发明之间进行交流的人,计算机或计划不进行沟通非常良好使用的文本。SQL是的文本,但是界面人告诉一个数据库什么要做。

因此,在一般情况下,文本数据,因此串,主要用于人人,或者人机互动(说内容的一个信息框)。他们用别的东西(例如阅读或书写的二进制的图像数据)是可能的,但携带大的风险,因为你正在使用的数据类型的东西就不是设计来处理。这使它更容易出错。你可以能够存储的二进制数据串,mbut只是因为你能够搬起石头砸自己的脚,你应该避免这样做。

摘要:你可以做到这一点。但你最好不要。

您的原始问题( c# - 什么是字符串真的很适合?)没什么意义。所以答案也没有意义。

您的原始问题是“但出于某种原因,当我将此字符串写入文件时,它不会打开。”这并不意味着什么。

您的原始问题不完整,答案令人误解和混淆。您可以在String中存储任何内容。期。 “字符串用于文本”。答案是因为你没有在你的问题中提供足够的信息来确定你的特定C#代码出了什么问题。

您没有提供代码段或错误消息。这就是为什么它很难“得到它” - 你没有提供足够的细节让我们知道你没有得到什么。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top