几天前,我问why its not possible to store binary data, such as a jpg file into a string variable。
我得到的大多数答案都说字符串用于文本信息,例如我现在正在写的内容。
什么是文本数据呢?某种性质的字节表示jpg文件,这些字节可以用字符字节值表示......我想。因此,当我们说字符串是用于文本信息时,是否存在某种范围或未存储的字符列表?
对不起,如果这个问题听起来很愚蠢。只是想'得到它'
答案 0 :(得分:2)
我发现将二进制数据存储在字符串中存在三个主要问题:
答案 1 :(得分:2)
我更希望将二进制数据存储为二进制数据,你只考虑在没有其他选择的情况下将其转换为文本,因为当你将它转换为文本表示时,它确实浪费了一些字节(不多,但仍然很重要) ,这就是他们如何将附件放入电子邮件中。
Base64是二进制文件的良好文本表示。
答案 2 :(得分:1)
我认为你指的是binary to text encoding issue。 (将jpg翻译成字符串将需要那种预处理)
事实上,在那篇文章中,一些字符被提及并不总是受支持,其他字符可能会令人困惑:
有些系统可以处理更有限的字符集;它们不仅不是8位清洁,有些甚至无法处理每个可打印的ASCII字符 其他人对换行符之间可能出现的字符数有限制 还有一些人在文本中添加标题或预告片。
一些未被充分考虑但仍在使用的协议使用带内信令,如果消息中出现特定模式,则会造成混淆。最着名的是用于分隔mbox文件格式的邮件消息的行开头的字符串“From”(包括尾随空格)。
答案 3 :(得分:1)
谁告诉你你不能把'二进制'数据放入字符串中是错误的。字符串只是表示您最有可能计划用于文本数据的字节数组......但没有什么可以阻止您将任何数据放在您想要的位置。
我必须要小心,因为我不知道你使用的语言是什么......在某些语言中\ 0结束了字符串。
在C#中,您可以将任何数据放入字符串中......例如:
byte[] myJpegByteArray = GetBytesFromSomeImage();
string myString = Encoding.ASCII.GetString(myJpegByteArray);
答案 4 :(得分:1)
在国际化之前,它并没有太大的区别。 ASCII字符都是字节,因此字符串,字符数组和字节数组最终具有相同的实现。
但是,现在,字符串要复杂得多,以便处理成千上万的外语字符以及随之而来的语言规则。
当然,如果你看得够深,一切都只是比特和字节,但是计算机如何解释它们的世界各不相同。 “文本”的规则使事物在向人类显示时看起来正确,但计算机可以自由地使用内部表示。例如,
答案 5 :(得分:0)
取决于语言。例如,在Python中,字符串类型(str)实际上是字节数组,因此它们确实可以用于二进制数据。
在C中,NULL字节用于字符串终止,因此sting不能用于任意二进制数据,因为二进制数据可能包含空字节。
在C#中,字符串是一个字符数组,由于char基本上是16bit int的别名,因此您可以放弃将任意二进制数据存储在字符串中。当您尝试显示字符串时可能会出错(因为某些值可能实际上不对应于合法的unicode字符),并且某些操作(如大小写转换)可能会以奇怪的方式失败。
简而言之,在某些语言中可能有可能将任意二进制数据存储在字符串中,但它们并非设计用于此用途,并且您可能会遇到各种不可预见的问题。大多数语言都有一个字节数组类型,用于存储任意二进制数据。
答案 6 :(得分:0)
内心深处一切都只是字节。 像字符串和图片之类的东西是由关于如何排序字节的规则定义的。 例如,字符串以值为32(或其他)的字节结尾 jpg没有
答案 7 :(得分:0)
我同意Jacobus'回答: 最后,所有数据结构都由字节组成。 (好吧,如果你走得更深:比特)。通过一些抽象,你可以说字符串或字节数组是程序员的惯例,关于如何访问它们。
在这方面,字符串是解释为文本的数据的抽象。文本是为人类之间的通信而发明的,计算机或程序使用文本进行的通信不是很好。 SQL是文本的,但它是人类告诉数据库做什么的接口。
因此,一般而言,文本数据以及字符串主要用于人与人之间,或人与机之间的交互(比如消息框的内容)。将它们用于其他东西(例如,读取或写入二进制图像数据)是可能的,但是由于您正在使用数据类型来处理其未设计的内容,因此会带来很多风险。这使得它更容易出错。你可能能够将二进制数据存储在字符串中,但是因为你能够用脚射击自己,你应该避免这样做。
总结:你可以做到。但你最好不要这样做。
答案 8 :(得分:0)
您的原始问题(c# - What is string really good for?)没有多大意义。所以答案也没有意义。
您的原始问题说“但出于某种原因,当我将此字符串写入文件时,它不会打开。”这并不意味着什么。
您的原始问题不完整,答案令人误解和混淆。您可以在String中存储任何内容。期。那里的“字符串是用于文本”的答案是因为你没有在你的问题中提供足够的信息来确定你的特定C#代码有什么问题。
您没有提供代码段或错误消息。这就是为什么它很难“得到它” - 你没有提供足够的细节让我们知道你没有得到什么。