Почему при использовании метода BlockCopy добавляются дополнительные 4 байта - PullRequest
0 голосов
/ 21 сентября 2011

После поиска мне не удалось найти легко понятное объяснение, почему дополнительные 4 байта добавляются при использовании метода BlockCopy (как показано здесь , здесь, здесь , здесь )

Документация гласит:

Как следует из названия,метод BlockCopy копирует блок байтов целиком, а не копирует один байт за раз.Следовательно, если src и dst ссылаются на один и тот же массив, а диапазон от srcOffset + count -1 перекрывает диапазон от dstOffset + count - 1, значения перекрывающихся байтов не перезаписываются до их копирования в место назначения.В следующем примере значения байтов 0-16 в массиве с именем arr копируются в байты 12-28.Несмотря на перекрывающийся диапазон, значения исходных байтов успешно копируются.

Однако я не совсем понимаю это ясно и надеялся, что кто-то будет достаточно любезен, чтобы объяснить это по-другому (или опубликовать ссылкук ресурсу, который объясняет это), и почему существует требование добавить эти дополнительные 4 байта.

Для ясности приведем код, на который я ссылаюсь:

Какчасть метода сжатия:

byte[] gzBuffer = new byte[compressed.Length + 4];
System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);

Как часть метода сжатия:

ms.Write(gzBuffer, 4, gzBuffer.Length - 4);

1 Ответ

5 голосов
/ 21 сентября 2011

Речь идет не о BlockCopy, а о префиксе длины некоторых данных, вот и все. Вы нашли немного кода, который был широко скопирован без особой документации.

Часто при чтении «сообщения» полезно знать, сколько времени занимает это сообщение, прежде чем вы начнете его читать - это означает, что вам не нужны разделители, или надеяться, что конец потока означает конец данных. Этот код просто сжимает данные, а затем записывает сжатую длину перед сжатыми данными.

...