从 BinaryReader 读取 UInt16 时出错

Error reading UInt16 from BinaryReader

为什么这样做

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

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

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

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

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