此链接解释了 Encoder.GetBytes 方法,并且还有一个名为 flush 的 bool 参数也进行了解释。冲洗的解释是:
如果此编码器可以在转换结束时刷新其状态,则为 true;否则为假。为确保正确终止编码字节块序列,对 GetBytes 的最后一次调用可以为刷新指定 true 值。
但我不明白flush是做什么的,也许我喝醉了或者什么的:)。你能详细解释一下吗?
此链接解释了 Encoder.GetBytes 方法,并且还有一个名为 flush 的 bool 参数也进行了解释。冲洗的解释是:
如果此编码器可以在转换结束时刷新其状态,则为 true;否则为假。为确保正确终止编码字节块序列,对 GetBytes 的最后一次调用可以为刷新指定 true 值。
但我不明白flush是做什么的,也许我喝醉了或者什么的:)。你能详细解释一下吗?
假设您通过套接字连接接收数据。您将收到一个包含多个byte[]
块的长文本。
有可能 1 个 Unicode 字符在 UTF-8 流中占用 2+ 个字节,并且它被分成 2 个字节块。单独编码 2 字节块(并连接字符串)会产生错误。
所以你只能flush=true
在最后一个块上指定。当然,如果你只有 1 个块,那么这也是最后一个。
提示:使用 TextReader 并让它为您处理此问题。
镜像问题(实际上被问到:GetBytes)稍微难以解释。
usingflush=true
与使用Encoder.Reset()
after相同GetBytes(...)
。它清除编码器的“状态”,
包括前一个数据块末尾的尾随字符,例如不匹配的高代理
基本思想是相同的:当从string
字节转换为块时,或者反之亦然,块不是独立的。
刷新将重置用于将文本编码为字节的编码器实例的内部状态。你问为什么它需要内部状态?好吧,引用 MSDN:
flush 参数对于在没有低代理项的流末尾刷新高代理项很有用。例如,UTF8Encoding.GetEncoder 创建的 Encoder 使用此参数来确定是否在字符块的末尾写出一个悬空的高代理。
因此,如果您使用 multiple GetBytes()
,您可能希望在末尾刷新内部状态以终止任何需要终止的字符序列,但仅在末尾,因为终止序列可能会在单词中间引入。
请注意,现在这可能是一个纯粹的理论问题。而且,无论如何,您最好还是使用更高级别的包装器。如果你这样做,醉酒将不是问题。