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
很难说没有知道你的输入和期望输出。
对于ASCII码,每个字节是一个码单元,是一个码点,是一个字符,是一个字形。
对于UTF-8,每个字节是一个代码单元,一个或多个是代码点,一个或多个是字形。
对于UTF-16,每两个字节是一个代码单元,一个或多个是代码点,一个或多个是字形。
要转换一个字节序列,只需使用一个调用GetString为适当的编码实例。然后你将处理String
,这是一个统计的Unicode/UTF-16码点序列。
当字节对编码没有意义时,内置Encoding类使用替换字符(“?”)。如果您愿意,您可以使用DecoderFallback异常创建一个实例,以便您能够处理这些情况。例如,0xFF永远不是有效的ASCII码单元; 0xCD是UTF-8中的有效代码单元,但0xCD 0x20序列无效。
想必您可以分开显示用的字形。见TextElementEnumerator。
是的,我的输入是单字节每个字符,所以在unicode的情况下,创建一个新的输入数组与零为第二个字节正在工作。现在我想知道如果我需要为UTF-8做同样的事情,因为Encoding.UTF8.IsSingleByte返回false,所以在UTF-8的情况下,这是否正确遵循与unicode相同的方法?也就是说,为第二个字节构建一个带有零的新数组。 – user1624552
@ user1624552 UTF-8更复杂,因为它使用可变数量的字节 - 1到6个字节 - 取决于代码点。 [This](https://en.m.wikipedia.org/wiki/UTF-8#Description)显示了详细信息 - 对于值 Mark
我想要做的是例如:对于单个字节,将其字符resprentation转换为不同的编码ASCII,UTF-8,unicode,....例如,字节97对应于ascii中的字符'a',字节97对应于unicode中的字符X,字节97对应于UTF-8中的字符X等等......等等,范围为[0-255] – user1624552