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

问题描述:

我正在从源读取RAW数据。这个原始数据是一个字节序列。 余字节序列存储到我定义为在以下VB.NET字节的数组:vb.net:使用Unicode将字节数组编码为字符串

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是一个文本框的数组,它的长度与框架相同。

和同类其他两个编码:

UTF8

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 

统一

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以下。它是否正确?

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

很难说没有知道你的输入和期望输出。

+0

是的,我的输入是单字节每个字符,所以在unicode的情况下,创建一个新的输入数组与零为第二个字节正在工作。现在我想知道如果我需要为UTF-8做同样的事情,因为Encoding.UTF8.IsSingleByte返回false,所以在UTF-8的情况下,这是否正确遵循与unicode相同的方法?也就是说,为第二个字节构建一个带有零的新数组。 – user1624552

+0

@ user1624552 UTF-8更复杂,因为它使用可变数量的字节 - 1到6个字节 - 取决于代码点。 [This](https://en.m.wikipedia.org/wiki/UTF-8#Description)显示了详细信息 - 对于值 Mark

+0

我想要做的是例如:对于单个字节,将其字符resprentation转换为不同的编码ASCII,UTF-8,unicode,....例如,字节97对应于ascii中的字符'a',字节97对应于unicode中的字符X,字节97对应于UTF-8中的字符X等等......等等,范围为[0-255] – user1624552

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

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

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

要转换一个字节序列,只需使用一个调用GetString为适当的编码实例。然后你将处理String,这是一个统计的Unicode/UTF-16码点序列。

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

想必您可以分开显示用的字形。见TextElementEnumerator