1

几天前,我问为什么不能将二进制数据,例如 jpg 文件存储到字符串变量中。

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

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

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

4

9 回答 9

2

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

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

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

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

于 2008-11-02T12:23:54.903 回答
1

我认为您指的是二进制到文本编码问题。(将 jpg 转换为字符串需要这种预处理)

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

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

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

于 2008-11-02T12:02:46.223 回答
1

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

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

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

byte[] myJpegByteArray = GetBytesFromSomeImage();

string myString = Encoding.ASCII.GetString(myJpegByteArray);
于 2008-11-02T12:06:56.560 回答
1

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

然而,如今,为了处理成千上万的外语字符和与之相关的语言规则,字符串变得更加复杂。

当然,如果你看得足够深入,一切都只是位和字节,但计算机如何解释它们是天壤之别。“文本”的规则使事物在显示给人类时看起来是正确的,但计算机可以随意使用内部表示。例如,

于 2008-11-02T14:06:35.867 回答
0

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

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

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

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

于 2008-11-02T12:00:46.667 回答
0

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

于 2008-11-02T12:00:54.513 回答
0

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

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

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

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

于 2008-11-02T12:18:01.733 回答
0

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

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

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

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

于 2008-11-02T12:18:16.613 回答