是否可以在不转换为字符串形式的情况下将 ASCII 数组作为数组进行操作?

Can ASCII arrays be manipulated as arrays without converting to String form?

这是一个基本问题,但我在上面找不到任何内容,因为我不知道要搜索什么 — 我的每次尝试都得出了不相关的结果。

如果我使用Text.Encoding.ASCII.GetBytes将字符串转换为ASCII,每个字节是否正好代表一个字符?以下代码是否在所有情况下都完全按照预期工作(对于示例以外的所有 Strings)?

Dim t1() As Byte = Text.Encoding.ASCII.GetBytes("Hello ")
Dim t2() As Byte = Text.Encoding.ASCII.GetBytes("World")

Dim msg As String = Text.Encoding.ASCII.GetString(t1.Concat(t2).ToArray)

现在 msg 应该是 "Hello World"

我希望它能正常工作,因为我不想将收到的数据转换回 Strings 以便在再次发送之前对其进行操作。

如果我使用 ASCII 以外的东西(例如 UTF-8)怎么办?

If I use Text.Encoding.ASCII.GetBytes to convert a string into ASCII, does each byte represent exactly one character?

是的。 ASCII是7bit编码,不支持多字节字符。 U-007F 以上的任何 Unicode 代码点都将转换为 ASCII 中的 ? 字符。

例如,如果您改用 UTF-7,它可以将单个 Unicode 代码点编码为多个 ASCII 字符的序列。

Does the following code work as exactly intended in all circumstances (for all Strings other than the examples)?

在您的特定示例中,是的(前提是您使用 LINQ 的 Concat() method - there are other ways 将数组连接在一起)。没有数据丢失。

但对于其他示例,只要知道如果将非 ASCII 字符转换为 ASCII 或 GetBytes()GetString() 之间的编码不匹配,就会丢失数据。

您当然可以操作字节数组。如果将它们合并在一起,请确保数组采用相同的编码。

.NET 字符串是 UTF-16 代码单元 (char) 的计数序列,其中一个或两个编码一个 Unicode 代码点 (int Char.ConvertToUtf32 )。一些代码点是 "combining characters",当应用于前面的 "base character" 时形成字素(然后由字体呈现为字形)。

从 Unicode 到另一个字符集编码的编码器应尝试保留字素。在 .NET 中,字素称为 "text element."

所以,是的,只要您没有通过将部分字素转换为不同的字节序列来打败编码器,就可以组合编码的字节序列。如果您在编码之前将字符串分成两部分,请参阅 TextElementEnumerator 和 StringInfo class。