【问题标题】:What defines data that can be stored in strings什么定义了可以存储在字符串中的数据
【发布时间】:2010-09-20 09:15:03
【问题描述】:

前几天,我问过why its not possible to store binary data, such as a jpg file into a string variable

我得到的大多数答案都说字符串用于文本信息,例如我现在正在写的内容。

什么是文本数据?某种性质的字节代表一个jpg文件,这些字节可以用字符字节值表示……我想。那么当我们说字符串用于文本信息时,是否存在某种未存储的范围或字符列表?

对不起,如果这个问题听起来很愚蠢。只是想“得到它”

【问题讨论】:

  • 最初的问题是针对 C# 的。这些答案与原始问题的上下文不太匹配。

标签: string character


【解决方案1】:

您最初的问题 (c# - What is string really good for?) 毫无意义。所以答案也没有意义。

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

您最初的问题不完整,答案具有误导性和混淆性。您可以将任何内容存储在字符串中。时期。 “字符串用于文本”的答案在那里,因为您没有在问题中提供足够的信息来确定您的特定 C# 代码出了什么问题。

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

【讨论】:

    【解决方案2】:

    在国际化之前,并没有太大区别。 ASCII 字符都是字节,因此字符串、字符数组和字节数组最终具有相同的实现。

    不过,如今,字符串要复杂得多,以便处理成千上万的外语字符和与之相关的语言规则。

    当然,如果您看得足够深入,一切都只是位和字节,但是计算机对它们的解释方式却大不相同。 “文本”的规则使事物在显示给人类时看起来是正确的,但计算机可以随意使用内部表示。例如,

    【讨论】:

      【解决方案3】:

      我同意Jacobus' 的回答: 最后,所有数据结构都是由字节组成的。 (好吧,如果你更深入:位)。通过一些抽象,您可以说字符串或字节数组是程序员关于如何访问它们的约定。

      在这方面,字符串是对解释为文本的数据的抽象。文本是为人类之间的交流而发明的,计算机或程序不能很好地使用文本进行交流。 SQL 是文本的,但它是人类告诉数据库该做什么的接口。

      因此,一般而言,文本数据以及字符串主要用于人与人或人与机器的交互(例如消息框的内容)。将它们用于其他事情(例如读取或写入二进制图像数据)是可能的,但会带来很多风险,因为您正在将数据类型用于它不适合处理的事情。这使得它更容易出错。您也许可以将二进制数据存储在字符串中,但是仅仅因为您可以在脚上开枪,您应该避免这样做。

      总结:你可以做到。但你最好不要。

      【讨论】:

        【解决方案4】:

        我更愿意将二进制数据存储为二进制,只有在别无选择时才会考虑将其转换为文本,因为当您将其转换为文本表示时,它确实会浪费一些字节(不多,但仍然很重要) ,这就是他们在电子邮件中添加附件的方式。

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

        【讨论】:

          【解决方案5】:

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

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

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

          简而言之,在某些语言中可能可以将任意二进制数据存储在字符串中,但它们不是为此而设计的,您可能会遇到各种无法预料的麻烦。大多数语言都有用于存储任意二进制数据的字节数组类型。

          【讨论】:

            【解决方案6】:

            告诉你不能将“二进制”数据放入字符串的人是错误的。字符串仅表示您最有可能计划用于文本数据的字节数组……但没有什么能阻止您将任何数据放入其中。

            不过我必须小心,因为我不知道您使用的是什么语言...而且在某些语言中,\0 以字符串结尾。

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

            byte[] myJpegByteArray = GetBytesFromSomeImage();
            
            string myString = Encoding.ASCII.GetString(myJpegByteArray);
            

            【讨论】:

            • 也许他可以。但他不应该。更正:他绝对可以。他绝对不应该。
            • 我倾向于同意...我不是在质疑“为什么”他要这样做:) 也许其他人编写了一个写入在线文件存储系统的函数。 . 它只需要字符串!!! (我正在编造):)
            【解决方案7】:

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

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

            【讨论】:

              【解决方案8】:

              我想你指的是binary to text encoding issue。 (将 jpg 转换为字符串需要这种预处理)

              确实,在那篇文章中,提到了某些字符并不总是受支持,而其他字符可能会令人困惑:

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

              还有一些不受欢迎但仍在使用的协议使用带内信令,如果消息中出现特定模式,则会导致混淆。最著名的是位于行首的字符串“From”(包括尾随空格),用于分隔 mbox 文件格式的邮件消息。

              【讨论】:

                【解决方案9】:

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

                【讨论】:

                • 如何终止字符串取决于所使用的编译器。我认为在 Delphi 中,字符串的长度由前两个字节表示,这就是为什么对于长度超过 0xFFFF 字符的字符串需要不同的变量。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-12-05
                • 1970-01-01
                • 1970-01-01
                • 2021-11-09
                • 1970-01-01
                • 2011-03-03
                相关资源
                最近更新 更多