繁体   English   中英

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

[英]vb.net: Encoding byte array into string using Unicode

我正在从来源读取RAW数据。 该原始数据是字节序列。 我将此字节序列存储到我在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,我通过执行上述循环得到以下结果 这个对吗?

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

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

在不知道您的输入和所需输出的情况下很难说出来。

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

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

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

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

当字节对编码没有意义时,内置的Encoding类将使用替换字符(“?”)。 如果愿意,可以创建一个带有DecoderFallback异常的实例,这样您就可以处理这些情况。 例如,0xFF永远不是有效的ASCII码单位; 0xCD是UTF-8中的有效代码单位,但序列0xCD 0x20无效。

大概是为了显示目的,您想分隔字形。 请参见TextElementEnumerator

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM