使用DotNetZip和MemoryStream时用''填充的解压缩数据



我正在尝试压缩内存中的数据(因此,我无法使用文件系统),在下面的示例中,当数据解压缩时,它在原始数据的末尾有一种填充('\0'字符)。

我做错了什么?

    [Test]
    public void Zip_and_Unzip_from_memory_buffer() {
        byte[] originalData = Encoding.UTF8.GetBytes("My string");
        byte[] zipped;
        using (MemoryStream stream = new MemoryStream()) {
            using (ZipFile zip = new ZipFile()) {
                //zip.CompressionMethod = CompressionMethod.BZip2;
                //zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestSpeed;
                zip.AddEntry("data", originalData);
                zip.Save(stream);
                zipped = stream.GetBuffer();
            }
        }
        Assert.AreEqual(256, zipped.Length); // Just to show that the zip has 256 bytes which match with the length unzipped below
        byte[] unzippedData;
        using (MemoryStream mem = new MemoryStream(zipped)) {
            using (ZipFile unzip = ZipFile.Read(mem)) {
                //ZipEntry zipEntry = unzip.Entries.FirstOrDefault();
                ZipEntry zipEntry = unzip["data"];
                using (MemoryStream readStream = new MemoryStream()) {
                    zipEntry.Extract(readStream);
                    unzippedData = readStream.GetBuffer();
                }
            }
        }
        Assert.AreEqual(256, unzippedData.Length); // WHY my data has trailing '' chars like a padding to 256 module ?
        Assert.AreEqual(originalData.Length, unzippedData.Length); // FAIL ! The unzipped data has 256 bytes
        //Assert.AreEqual(originalData, unzippedData); // FAIL at index 9
    }

来自 MSDN

"请注意,缓冲区包含可能未使用的已分配字节。例如,如果将字符串"test"写入 MemoryStream 对象,则从 GetBuffer 返回的缓冲区长度为 256,而不是 4,其中 252 字节未使用。若要仅获取缓冲区中的数据,请使用 ToArray 方法;

所以你实际上想改变这一行: zipped = stream.GetBuffer();

到行:zipped = stream.ToArray();

我怀疑它来自'MemoryStream.GetBuffer()'

http://msdn.microsoft.com/en-us/library/system.io.memorystream.getbuffer.aspx

请注意,缓冲区包含可能未使用的已分配字节。例如,如果将字符串"test"写入 MemoryStream 对象,则从 GetBuffer 返回的缓冲区长度为 256,而不是 4,其中 252 字节未使用。若要仅获取缓冲区中的数据,请使用 ToArray 方法;但是,ToArray 会在内存中创建数据的副本。

最新更新