【问题标题】:Error reading UInt16 from BinaryReader从 BinaryReader 读取 UInt16 时出错
【发布时间】:2018-01-13 15:18:08
【问题描述】:

为什么会这样

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

【问题讨论】:

    标签: vb.net unicode binary ascii uint16


    【解决方案1】:

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

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

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

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

    【讨论】:

    • +1 非常感谢您澄清这一点。我现在将确保为此使用 Unicode 编码。
    • @Adam :很高兴我能帮上忙!这并不意味着您不能在应用程序中使用其他编码,但为了将其 back 转换为 UShort,您应该坚持使用 Unicode。祝你好运!
    • 小提琴非常有用,我现在可以修复我的代码中的许多错误。 :)
    猜你喜欢
    • 1970-01-01
    • 2012-03-16
    • 2016-01-17
    • 2019-03-06
    • 2015-06-19
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多