我有以下方法,由于某种原因,第一次调用Copy似乎什么也没做?谁知道为什么? 在压缩方法的输入中,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();
}
}
答案 0 :(得分:2)
只是一个猜测,但是因为新的GZipStream
构造函数将索引保留在数组的末尾,并且第一个CopyTo
将其重置为开头,因此当您调用第二个时CopyTo
它现在处于开始状态并正确复制数据?
答案 1 :(得分:2)
如果对Read()的第一次调用返回0,那么Stream.CopyTo()也不会起作用。虽然这表明GZipStream存在问题,但非常不太可能存在类似这样的错误。创建压缩数据时出现问题的可能性更大。比如首先压缩0个字节,然后压缩实际数据。
答案 2 :(得分:1)
你有多确定第一份副本什么都不做,而第二份副本无效
,这将是GZipStream
类中的错误。您的代码应该可以正常工作,而无需两次调用CopyTo。
答案 3 :(得分:0)
嗨,谢谢大家的意见。事实证明,错误是由编码方法中的错误引起的。方法是
/// <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());
}
}
感谢大家的帮助。