У меня есть следующий метод, и по некоторым причинам первый вызов, который Скопирует в, кажется, ничего не делает? Кто-либо знает почему? Во входе к методу сжат, и base64 может предоставить тот метод к если потребность.
private byte[] GetFileChunk(string base64)
{
using (
MemoryStream compressedData = new MemoryStream(Convert.FromBase64String(base64), false),
uncompressedData = new MemoryStream())
{
using (GZipStream compressionStream = new GZipStream(compressedData, CompressionMode.Decompress))
{
// first copy does nothing ?? second works
compressionStream.CopyTo(uncompressedData);
compressionStream.CopyTo(uncompressedData);
}
return uncompressedData.ToArray();
}
}
Если первый вызов Read () вернет 0, Stream.CopyTo () тоже не будет работать. Хотя это указывает на проблему с GZipStream, очень маловероятно, что в нем есть подобная ошибка. Гораздо более вероятно, что при создании сжатых данных что-то пошло не так. Как сначала сжатие 0 байтов, а затем сжатие реальных данных.
Просто предположение, но это потому, что новый конструктор GZipStream
оставляет индекс в конце массива, а первый CopyTo
сбрасывает его в начало, так что когда вы вызываете второй CopyTo
, он теперь в начале и копирует данные правильно?
Насколько вы уверены, что первая копия ничего не делает, а вторая работает?
GZipStream
, это было бы ошибкой в классе GZipStream
. Ваш код должен работать нормально без двойного вызова CopyTo.
Привет, спасибо за ваш вклад. Оказывается, ошибка была вызвана ошибкой в методе кодирования. Метод был
/// <summary>
/// Compress file data and then base64s the compressed data for safe transportation in XML.
/// </summary>
/// <returns>Base64 string of file chunk</returns>
private string GetFileChunk()
{
// MemoryStream for compression output
using (MemoryStream compressed = new MemoryStream())
{
using (GZipStream zip = new GZipStream(compressed, CompressionMode.Compress))
{
// read chunk from file
byte[] plaintext = new byte[this.readSize];
int read = this.file.Read(plaintext, 0, plaintext.Length);
// write chunk to compreesion
zip.Write(plaintext, 0, read);
plaintext = null;
// Base64 compressed data
return Convert.ToBase64String(compressed.ToArray());
}
}
}
. Линия возврата должна быть ниже точки использования, позволяя потоку сжатия закрывать и очищать, это вызвало несогласованное поведение при распаковке потока.
/// <summary>
/// Compress file data and then base64s the compressed data for safe transportation in XML.
/// </summary>
/// <returns>Base64 string of file chunk</returns>
private string GetFileChunk()
{
// MemoryStream for compression output
using (MemoryStream compressed = new MemoryStream())
{
using (GZipStream zip = new GZipStream(compressed, CompressionMode.Compress))
{
// read chunk from file
byte[] plaintext = new byte[this.readSize];
int read = this.file.Read(plaintext, 0, plaintext.Length);
// write chunk to compreesion
zip.Write(plaintext, 0, read);
plaintext = null;
}
// Base64 compressed data
return Convert.ToBase64String(compressed.ToArray());
}
}
Спасибо за помощь.