嗨谢谢大家的意见。事实证明,错误是由编码方法中的错误引起的。方法是
/// <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());
}
}
谢谢大家的帮助。
第一个副本不会填充流;读取方法得到相同的行为。 GZipStream是一个微软的类,在课堂上没有错误吗? – 2010-08-09 13:28:20
嗯,你是100%肯定。 Read是完全不同的事情,完全read方法的契约说它不能保证返回请求的字节数量,但CopyTo文档没有提出相同的声明,但也许它在内部使用Read方法。你有没有尝试过使用它在Stream.Read MSDN页面的每个例子的循环http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx – 2010-08-09 13:38:31
雅开始一个循环,第一次读取调用返回0,后续调用读取返回字节直到结束。 – 2010-08-09 13:57:43