【问题标题】:How BinaryWriter.Write() write stringBinaryWriter.Write() 如何写入字符串
【发布时间】:2009-09-27 04:05:37
【问题描述】:

我使用BinaryWriter.Write()写字符串,在msdn中,描述如下:

将一个以长度为前缀的字符串写入 此流在当前编码中 BinaryWriter,并推进 流的当前位置 根据使用的编码和 正在写入的特定字符 到流中。

我认为长度前缀是固定大小的;但实际上它是可变大小的。 有关此方法如何计算前缀长度的详细信息?

【问题讨论】:

  • 这是一种变长编码。如果字符串长度小于 128 字节,则长度可以用单个字节表示。有关算法的描述,请参阅informit.com/guides/content.aspx?g=dotnet&seqNum=701
  • 这是 4 年前提出的问题,无论如何感谢您的评论 :-)

标签: .net


【解决方案1】:

前缀使用无符号 LEB128 格式编码:http://en.wikipedia.org/wiki/LEB128

基本上,如果长度为 127 或更小,则写入单个字节。如果更大,则设置高位,并写入长度的接下来的 7 位。如果仍然没有足够的位(长度为 16k 或更大),则再次设置高位,并写入另外 7 位。

所以,需要多少字节来存储长度,每个字节有 7 位长度,高位表示是否存在另一个长度字节。

【讨论】:

    【解决方案2】:

    .NET 4.0 及以上版本,MSDN also says

    以长度为前缀的字符串表示字符串长度通过给字符串添加一个包含该字符串长度的单个字节或单词的前缀。此方法首先将字符串的长度写入为 UTF-7 编码的无符号整数,然后使用 BinaryWriter 实例的当前编码将那么多字符写入流

    对于早期版本,它说:

    以长度为前缀的字符串表示字符串长度通过给字符串添加一个包含该字符串长度的单个字节或单词的前缀。此方法首先将字符串的长度写入为一个四字节无符号整数,然后使用 BinaryWriter 实例的当前 Encoding 将那么多字符写入流

    【讨论】:

    • 如何判断是读/写单字节还是4字节字?
    • 奇怪的是,当我点击该链接时,我得到:“此方法首先将字符串的长度写入为 UTF-7 编码的无符号整数。”没有提及“四字节无符号整数”。
    • @JimMischel 如果您在 2009 年发布此主题时将框架版本更改为较早版本,则措辞会更改为上面显示的内容。
    • @RexM:谢谢。我什至没有看日期。有趣的是,当时的文档是错误的。 BinaryWriter 至少早在 2003 年就使用 7 位编码方案。
    猜你喜欢
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多