【问题标题】:Why we use flush parameter with Encoder.GetBytes method为什么我们在 Encoder.GetBytes 方法中使用 flush 参数
【发布时间】:2011-04-20 23:01:13
【问题描述】:

这个link 解释了 Encoder.GetBytes 方法,还有一个名为 flush 的 bool 参数也进行了解释。冲洗的解释是:

如果这个编码器可以刷新它的 转换结束时的状态; 否则为假。为确保正确 终止一系列块的 编码字节,最后一次调用 GetBytes 可以指定值为 true 用于冲洗。

但我不明白 flush 是做什么的,也许我喝醉了或什么的 :)。请您详细解释一下。

【问题讨论】:

  • 这里好像有“重新标记战”!
  • 是的,我尽可能地加入了。
  • @Henk lool :) 随时欢迎你,继续战斗,直到我打电话给备份:D
  • @Henk 网站章程积极阻止发明无用和/或模棱两可的新标签,例如bcl(15 个帖子)。 :)
  • 是的,我添加了 bcl,因为我“遇到”了它。但是 VB 和 C# 对这种类型很有用。

标签: c# .net vb.net character-encoding base-class-library


【解决方案1】:

在内部,Encoder 将使用缓冲区实现 - 可能需要刷新(清除)该缓冲区才能正确结束读取或准备 Encoder 以进行下一次读取。

Here 是缓冲区刷新的一种解释。

flush 参数的具体用法描述here

true 表示转换后清除编码器内部状态;否则为假。

【讨论】:

    【解决方案2】:

    假设您通过套接字连接接收数据。您将收到包含多个 byte[] 块的长文本。

    有可能 1 个 Unicode 字符在 UTF-8 流中占用 2+ 个字节,并且它被分成 2 个字节块。单独编码 2 字节块(并连接字符串)会产生错误。

    所以你只能在最后一个块上指定flush=true。当然,如果你只有 1 个块,那么这也是最后一个。

    提示:使用 TextReader 并让它为您处理此问题。

    编辑

    镜像问题(实际上被问到:GetBytes)稍微难以解释。

    使用flush=true 与在GetBytes(...) 之后使用Encoder.Reset() 相同。它清除编码器的“状态”,

    包括前一个数据块末尾的尾随字符,例如不匹配的高代理项

    基本思想是相同的:当从string 转换为字节块时,或者反之亦然,这些块不是独立的。

    【讨论】:

    • GetBytes() 用于从字符到字节,反之亦然。 :)
    • 我认为这种镜像正是让 OP 感到困惑的原因。也许您愿意回答实际问题。 :)
    【解决方案3】:

    刷新将重置用于将文本编码为字节的编码器实例的内部状态为什么它需要内部状态,你问?好吧,引用 MSDN:

    flush 参数对于在流结束时刷新高代理项很有用 没有低代理。例如,由 UTF8Encoding.GetEncoder 使用这个参数来判断是否写出一个 在字符块末尾悬挂高代理项。

    如果您使用多个GetBytes(),因此,您可能希望在末尾刷新内部状态以终止任何需要终止的字符序列,但仅在末尾​​em>,因为终止否则可能会在单词中间引入序列。

    请注意,现在这可能是一个纯粹的理论问题。而且,你最好using higher-level wrappers anyway。如果你这样做了,喝醉就不是问题了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 1970-01-01
      • 2022-01-06
      相关资源
      最近更新 更多