Visual Basic系统文本编码没有EOF / EOL的GetBytes

时间:2017-10-08 10:46:27

标签: vb.net encoding

我尝试读取一个字符串,将其哈希,但是当我使用时(例如使用字符串“0”)

System.Text.Encoding.Unicode.GetBytes("0")

生成Bytes to hash我总是将EOF / EOL作为最后一个字节。

是否有一种简单的方法可以不在字节数组中获得EOL / EOF,或者我是否必须删除字节数组的最后一个字节,以摆脱它?

1 个答案:

答案 0 :(得分:0)

Encoding.Unicode

  

使用小端字节顺序对UTF-16格式进行编码。

这意味着每个字符(至少)有两个字节。很容易证明当你获得UTF-16的字节时会发生什么,以及大端编码会发生什么以及UTF-8会发生什么:

Imports System.Text

Module Module1

    Sub ShowAsHex(bb() As Byte)
        Console.WriteLine(String.Join(" ", bb.Select(Function(b) Hex(b).PadLeft(2, "0"c))))

    End Sub

    Sub Main()
        Dim bb = Encoding.Unicode.GetBytes("0")
        ShowAsHex(bb)
        bb = Encoding.Unicode.GetBytes("HELLO")
        ShowAsHex(bb)
        bb = Encoding.BigEndianUnicode.GetBytes("HELLO")
        ShowAsHex(bb)
        bb = Encoding.UTF8.GetBytes("0")
        ShowAsHex(bb)
        bb = Encoding.UTF8.GetBytes("HELLO")
        ShowAsHex(bb)

        Console.ReadLine()

    End Sub

End Module

输出:

  

30 00
  48 00 45 00 4C 00 4C 00 4F 00
  00 48 00 45 00 4C 00 4C 00 4F
  30个
  48 45 4C 4C 4F

请注意,在较长的文本(“HELLO”)中有一些值为零的字节,因此它们不能代表EOL / EOF,甚至不能代表C风格字符串的空终止符

因此,您解释为EOL / EOF字符实际上是该编码中字符的另一个字节。 Windows上的EOL通常是两个字节0D 0A,即CRLF或\ r \ n。

您似乎想要使用Encoding.UTF8