MSDN C# DeflateStream issue code issue


0

Любые идеи, почему в приведенном ниже примере нам нужно добавить 100 (buffer.Length + 100)? buffer.Length должен быть таким же, как и длина распакованного буфера, поэтому нет необходимости добавлять еще 100. :-)

http://msdn.microsoft.com/en-us/library/bc2dbwea.aspx

спасибо заранее, Джордж

3

Я не знаю, почему они делают это, но это не большой пример в целом - например, они используют явные вызовы Close (не в блоке finally) на FileStream вместо использования оператора using, а также при условии, что один вызов Read будет читать весь файл. Черт, даже чтение всего файла в буфер - плохая идея - было бы лучше скопировать кусок за один раз прямо в DeflateStream.

Эти вещи подсказывают мне, что в этом примере не стоит беспокоиться об этом конкретном нечетном бите кода (дополнительные 100 байт). Конечно, не считайте это «лучшей практикой».

Примеры MSDN обычно лучше этого, хотя есть много других нечетных.

EDIT: перечитав код и ответ CodeMelt, он действительно нуждается в дополнительных 100 байтах, но только потому, что ReadAllBytesFromStream реализован так плохо. Вот лучше реализация, которая всегда запрашивает поток, чтобы заполнить остальную часть буфера:

public static int ReadAllBytesFromStream(Stream stream, byte[] buffer) 
{ 
    int offset = 0; 
    int bytesRead; 
    while ((bytesRead = stream.Read(buffer, offset, 
            buffer.Length-offset)) > 0) 
    { 
     offset += bytesRead; 
    } 
    return offset; 
} 

(Обратите внимание, что не было никакой необходимости, так offset и totalCount, поскольку они всегда имели одинаковое значение.)

  0

Я полностью согласен с вами в отношении ваших близких точек и чтения всех байтов. Я просто хочу подтвердить, что буфер декомпрессии имеет одинаковую длину исходного буфера, нет необходимости в методах выделения 100 байт или что-то еще? 22 фев. 092009-02-22 12:26:54

  0

В каких ситуациях может произойти предыдущий код реализации? Не могли бы вы показать мне пример, пожалуйста? 22 фев. 092009-02-22 14:13:38

  0

Он выкинет ArgumentException, когда он приблизится к концу массива (если вы не сделаете массив на 100 байт больше необходимого), поскольку параметр «count» был исправлен на уровне 100. 22 фев. 092009-02-22 14:43:14

  0

Hi Jon Skeet, какие файлы вызовет такое исключение типа? Какой размер? Мне интересно сделать один тестовый пример и сделать мои руки грязными. 24 фев. 092009-02-24 14:52:36

  0

Исключение будет выдаваться только в том случае, если вы выберете дополнительные 100 байт, но * не * исправьте метод ReadAllBytesFromStream. Я думаю, что в этом случае * любой * файл предоставил бы исключение. 24 фев. 092009-02-24 15:04:46


2

Это предотвращает переток stream.Read (buffer, offset, 100) по его длине в следующем методе, потому что поток продолжает считывать, пока он ничего не читает.

public static int ReadAllBytesFromStream(Stream stream, byte[] buffer) 
{ 
// Use this method is used to read all bytes from a stream. 
int offset = 0; 
int totalCount = 0; 
    while (true) 
    { 
    // even it reads to the end, but it will still read the next 
    // 100 bytes to see if anything has been read. 
    int bytesRead = stream.Read(buffer, offset, 100); 
     if (bytesRead == 0) 
     { 
     break; 
     } 
offset += bytesRead; 
totalCount += bytesRead; 
    } 
return totalCount; 
} 
  0

Confused. :-(Что вы подразумеваете под «переходом по своей длине» и в каком сценарии он «перейдет по своей длине»? Если длина результата такая же, как и исходная длина ввода, это нормально и не нужно выделять более 100 байтов. 22 фев. 092009-02-22 12:31:31

  0

ReadAllBytesFromStream не проверяет длину буфера, дополнительные 100 байт там, чтобы дать комнату для stream.Read (буфер, смещение, 100); для возврата 0; 22 фев. 092009-02-22 12:33:46

  0

Но я думаю, что нет необходимости делать дополнительную комнату? это эффект, если нет такой дополнительной комнаты? Этот код кода действительно странный. 22 фев. 092009-02-22 12:36:52

  0

@ George2: Да, это в основном из-за плохой реализации ReadAllBytesFromStream. См. мой обновленный ответ для лучшей реализации. 22 фев. 092009-02-22 12:38:25

  0

В каких ситуациях предыдущая реализация Код имеет вопрос? Не могли бы вы показать мне пример, пожалуйста? 22 фев. 092009-02-22 14:14:17