2017-08-06 192 views
-1

阅读UINT16为什么这项工作错误从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。为什么会这样,我做错了什么?

回答

1

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

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

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

这拨弄说明了什么我谈论:https://dotnetfiddle.net/p4EKn9

+0

+1谢谢你这么多的澄清这一点。我现在将确保为此使用Unicode编码。 – Adam

+0

@亚当:很高兴我能帮忙!这并不意味着你不能在你的应用程序中使用其他编码,但为了将它转换成'UShort',你应该坚持使用Unicode。祝你好运! –

+0

小提琴非常有用,我现在可以在我的代码中修复很多错误。 :) – Adam