-1

为什么这行得通

Dim mem As New MemoryStream()
Dim bin As New BinaryWriter(mem)
bin.Write(CUShort(1000))
Dim read As New BinaryReader(New MemoryStream(mem.ToArray))
MsgBox(read.ReadInt16)

消息框给我 1000 是正确的。然后我尝试使用这个

Dim mem As New MemoryStream()
Dim bin As New BinaryWriter(mem)
bin.Write(CUShort(1000))
Dim s As String = ASCII.GetString(mem.ToArray)
Dim read As New BinaryReader(New MemoryStream(ASCII.GetBytes(s)))
MsgBox(read.ReadInt16)

它给了我 831 这是不正确的。现在我尝试使用 Unicode 编码。有用。但我想使用 ASCII。为什么会这样,我做错了什么?

4

1 回答 1

1

由于 .NET 运行时将字符串存储在内存中的方式以及不同的编码具有不同的字符集,您会遇到这种情况。

A(U)Short在内存中用两个字节表示。当您调用时ASCII.GetString(),字节数组被解释为来自 ASCII 字符串,因此被转换为 UTF-16 字符串。执行此转换是因为 UTF-16 是 .NET 运行时将所有字符串存储在内存中的编码。

Encoding.Unicode然而与 UTF-16 相同,因此(此时)不需要额外的转换来将字符串存储在内存中。字节数组只是被复制并标记为字符串,因此您得到完全相同的字节和相同的UShort.

这个小提琴说明了我在说什么:https ://dotnetfiddle.net/p4EKn9

于 2017-08-06T11:46:42.643 回答