2017-08-06 195 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