Почему мы используем параметр flush с методом Encoder.GetBytes - PullRequest
6 голосов
/ 04 октября 2010

Эта ссылка объясняет метод Encoder.GetBytes, а также есть параметр bool с именем flush объясненный. Объяснение флеша:

true, если этот кодер может сбросить состояние в конце преобразования; иначе ложно. Для обеспечения правильного прекращение последовательности блоков закодированные байты, последний вызов GetBytes может указывать значение true для флеша.

но я не понял, что делает флеш, может, я пьян или что-то в этом роде :). Можете ли вы объяснить это более подробно, пожалуйста.

Ответы [ 3 ]

6 голосов
/ 04 октября 2010

Предположим, вы получаете данные через сокетное соединение.Вы получите длинный текст в виде нескольких byte[] блоков.

Возможно, что 1 символ Unicode занимает 2+ байта в потоке UTF-8 и что он разделен на 2 байтовых блока.Кодирование двухбайтовых блоков отдельно (и конкатенация строк) приведет к ошибке.

Таким образом, вы можете указать flush=true только в последнем блоке.И, конечно, если у вас есть только 1 блок, то это также последний.

Подсказка: используйте TextReader и позвольте ему решить эту проблему (проблемы) для вас.

Редактировать

Проблема с зеркалом (которая фактически задавалась: GetBytes) немного сложнееобъяснить.

Использование flush=true аналогично использованию Encoder.Reset() после GetBytes(...).Он очищает «состояние» кодера,

, включая завершающие символы в конце предыдущего блока данных, такие как непревзойденный старший суррогат

Основная идея заключается в том, чтото же самое: при преобразовании из string в байтовые блоки или наоборот, блоки не независимы.

2 голосов
/ 04 октября 2010

Flushing будет сбрасывать внутреннее состояние экземпляра кодера , используемого для кодирования текста в байты. Зачем ему нужно внутреннее состояние , спросите вы?Ну, процитируем MSDN:

Параметр flush полезен для очистки суррогата с высоким суррогатом в конце потока, который не имеет суррогата с низким суррогатом.Например, кодировщик, созданный UTF8Encoding.GetEncoder, использует этот параметр, чтобы определить, следует ли записывать висячий высокий суррогат в конце блока символов.

Если вы используете несколько GetBytes()следовательно, вы хотели бы очистить внутреннее состояние в конце, чтобы завершить любые последовательности символов, которые должны завершаться, но только в конце, так как в противном случае завершающие последовательности могли бы быть введены в середине слов.

Обратите внимание, что в наши дни это может быть чисто теоретической проблемой.И в любом случае вам лучше было бы использовать обертки более высокого уровня .Если вы это сделаете, пьянство не будет проблемой.

2 голосов
/ 04 октября 2010

Внутренне Encoder будет реализован с буфером - этот буфер может потребоваться очистить (очистить), чтобы правильно завершить чтение или подготовить Encoder для следующего чтения.

Здесь является одним из объяснений очистки буфера.

Точное использование параметра flush описано здесь :

Значение true, чтобы очистить внутреннее состояние кодера после преобразования; иначе ложно.

...