我正在从源头读取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以下。这是对的吗?
答案 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。