从BinaryReader读取UInt16时出错

时间:2017-08-06 01:51:48

标签: vb.net unicode binary ascii uint16

为什么这样做

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。为什么这样,我做错了什么?

1 个答案:

答案 0 :(得分:1)

您遇到的情况是因为.NET运行时将字符串存储在内存中,并且因为不同的编码具有不同的字符集。

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

然而,

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

这个小提琴说明了我在谈论的内容:https://dotnetfiddle.net/p4EKn9