8

私はメモリ内のデータを圧縮および解凍しようとしています (そのため、FileSystem を使用できません)。以下のサンプルでは、​​データを解凍すると、元のデータの末尾に一種のパディング ('\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 '\0' 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
    }
4

2 に答える 2

8

MSDNから

「バッファには未使用の可能性がある割り当てられたバイトが含まれていることに注意してください。たとえば、文字列「test」が MemoryStream オブジェクトに書き込まれた場合、GetBuffer から返されるバッファの長さは 4 ではなく 256 で、252 バイトは未使用です。取得するにはバッファ内のデータのみ、ToArray メソッドを使用します。

したがって、実際に行を変更する必要があります。 zipped = stream.GetBuffer();

行に:zipped = stream.ToArray();

于 2012-12-19T15:59:59.853 に答える
1

'MemoryStream.GetBuffer()'からだと思います

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

バッファには、使用されていない可能性のある割り当てられたバイトが含まれていることに注意してください。たとえば、文字列「test」がMemoryStreamオブジェクトに書き込まれる場合、GetBufferから返されるバッファの長さは4ではなく256で、252バイトは未使用です。バッファ内のデータのみを取得するには、ToArrayメソッドを使用します。ただし、ToArrayはデータのコピーをメモリに作成します。

于 2012-12-19T16:00:27.450 に答える