6

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

如果此编码器可以在转换结束时刷新其状态,则为 true;否则为假。为确保正确终止编码字节块序列,对 GetBytes 的最后一次调用可以为刷新指定 true 值。

但我不明白flush是做什么的,也许我喝醉了或者什么的:)。你能详细解释一下吗?

4

3 回答 3

6

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

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

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

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

编辑

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

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

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

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

于 2010-10-04T18:35:40.793 回答
2

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

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

此处描述了该flush参数的确切用法:

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

于 2010-10-04T18:30:15.180 回答
2

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

flush 参数对于在没有低代理项的流末尾刷新高代理项很有用。例如,UTF8Encoding.GetEncoder 创建的 Encoder 使用此参数来确定是否在字符块的末尾写出一个悬空的高代理。

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

请注意,现在这可能是一个纯粹的理论问题。而且,无论如何,您最好还是使用更高级别的包装器。如果你这样做,醉酒将不是问题。

于 2010-10-04T18:36:55.127 回答