vb.net:使用Unicode将字节数组编码为字符串

时间:2016-03-08 16:56:12

标签: vb.net unicode encoding bytearray

我正在从源头读取RAW数据。此原始数据是字节序列。 我将这个Bytes序列存储到一个Bytes数组中,我在VB.NET中定义如下:

Dim frame() as Byte

所以上面数组中的每个元素都在[0-255]范围内。

我想将这些字节中的每一个编码为ASCII,UTF-8和Unicode,因此我迭代字节数组(帧)并根据具体情况执行下面的代码段:

ASCII

For idxByte As Integer = 0 To Me.frame.Length - 1
    txtRefs(idxByte).Text = Encoding.ASCII.GetString(String.Format("<{0}>", Encoding.GetString(frame, idxByte, 1))
Next

注意:txtRefs是一个文本框数组,其长度与框架相同。

与其他两种编码类似:

UTF-8

For idxByte As Integer = 0 To Me.frame.Length - 1
    txtRefs(idxByte).Text = Encoding.UTF8.GetString(String.Format("<{0}>", Encoding.GetString(frame, idxByte, 1))
Next

的Unicode

For idxByte As Integer = 0 To Me.frame.Length - 1
    txtRefs(idxByte).Text = Encoding.Unicode.GetString(String.Format("<{0}>", Encoding.GetString(frame, idxByte, 1))
Next

ASCII和UTF8编码似乎没问题,但是Unicode编码似乎无法正常工作,或者我根本不理解Unicode编码功能......

对于unicode,我通过执行上面的循环得到result以下。这是对的吗?

2 个答案:

答案 0 :(得分:1)

Encoding.Unicode是UTF-16 LE,因此它需要两个字节才能给出正确的结果。 e.g。

Dim input() As Byte = { 65, 0 }
Dim x = Encoding.Unicode.GetString(input, 0, 1)
Dim y = Encoding.Unicode.GetString(input, 0, 2)
Console.WriteLine("x={0}, y={1}", x, y)
  

x = ,y = A

但是,如果您的输入是每个字符的单字节,您可能不希望从输入数组中传递两个字节。您可能想要创建一个零秒字节的新输入数组:

Dim input() As Byte = { 65, 0 }
Dim x = Encoding.Unicode.GetString(input, 0, 1)
Dim y = Encoding.Unicode.GetString(input, 0, 2)
Dim z = Encoding.Unicode.GetString(New Byte() { input(0), 0 })
Console.WriteLine("x={0}, y={1}, z={2}", x, y, z)
  

x = ,y = A,z = A

在不知道输入和所需输出的情况下很难分辨。

答案 1 :(得分:0)

对于ASCII,每个字节都是一个代码单元,是一个代码点,是一个字符,是一个字形。

对于UTF-8,每个字节是代码单元,一个或多个是代码点,一个或多个是字形。

对于UTF-16,每两个字节是一个代码单元,一个或多个是一个代码点,一个或多个是一个字形。

要转换字节序列,只需对适当的Encoding实例使用一次GetString调用。然后,您将处理String,这是Unicode / UTF-16代码点的计数序列。

当字节对编码有意义时,内置的编码类使用替换字符(&#34;?&#34;)。如果您愿意,可以使用DecoderFallback异常创建实例,以便您能够处理这些情况。例如,0xFF永远不是有效的ASCII码单元; 0xCD是UTF-8中的有效代码单元,但序列0xCD 0x20无效。

据推测,您希望将字形分开以用于显示目的。请参阅TextElementEnumerator