ASCII数组可以作为数组操作而不转换为String形式吗?

时间:2016-08-29 19:57:51

标签: vb.net concatenation ascii bytearray

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

如果我使用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)怎么办?

2 个答案:

答案 0 :(得分:2)

  

如果我使用Text.Encoding.ASCII.GetBytes将字符串转换为ASCII,那么每个字节是否只代表一个字符?

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

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

  

以下代码是否在所有情况下都能正常工作(对于除示例之外的所有字符串)?

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

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

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

答案 1 :(得分:1)

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

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

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