C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: GZIP圧縮/解凍にて解凍ができない


(過去ログ 11 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■2755 / inTopicNo.1)  GZIP圧縮/解凍にて解凍ができない
  
□投稿者/ 小倉 (1回)-(2007/04/15(Sun) 18:00:42)

分類:[VB.NET (Windows)] 

はじめまして、小倉と申します。
表題の件質問させて頂きます。

このサイト http://www.atmarkit.co.jp/fdotnet/dotnettips/485gzipstream/gzipstream.html
を参考に、TextBox1の内容を圧縮/解凍してその結果をTextBox2へ書き込むプログラムを作成
したのですが、解凍時の解凍ストリームdecompStreamからの読み出しができません(num=0)。
入力ストリームは inMs.Length=inByte.Length, inMs.Position=0 になっていて問題ないと思
いますが、メモリストリームの使い方が悪いのでしょうか。よろしくお願いします。

    'GZIP圧縮/解凍
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
                             Handles Button1.Click
        Dim gz As New Gzip
        '圧縮
        Dim cmpByte As Byte() = gz.Compress(Me.TextBox1.Text)
        '解凍
        Me.TextBox2.Text = gz.Decompress(cmpByte)
    End Sub

'圧縮/解凍
Public Class Gzip
    '圧縮
    Public Function Compress(ByVal inText As String) As Byte()

        Dim inByte() As Byte = Encoding.Unicode.GetBytes(inText)
        Dim num As Integer
        Dim buf(1024) As Byte ' 1Kbytesずつ処理する

        ' 入力ストリーム
        Dim inMs As New MemoryStream(inByte)
        ' 出力ストリーム
        Dim outMs As New MemoryStream()
        ' 圧縮ストリーム
        Dim compStream As New GZipStream(outMs, CompressionMode.Compress)

        Using inMs
            Using outMs
                Using compStream
                    Do
                        num = inMs.Read(buf, 0, buf.Length)
                        If num <= 0 Then Exit Do
                        compStream.Write(buf, 0, num)
                    Loop
                    Return outMs.ToArray
                End Using
            End Using
        End Using
    End Function

    '解凍
    Public Function Decompress(ByVal inByte As Byte()) As String

        Dim num As Integer
        Dim buf(1024) As Byte ' 1Kbytesずつ処理する

        ' 入力ストリーム
        Dim inMs As New MemoryStream(inByte)
        ' 解凍ストリーム
        Dim decompStream As New GZipStream(inMs, CompressionMode.Decompress)
        ' 出力ストリーム
        Dim outMs As New MemoryStream()

        Using inMs
            Using outMs
                Using decompStream
                    Do
                        num = decompStream.Read(buf, 0, buf.Length)
                        If num <= 0 Then Exit Do
                        outMs.Write(buf, 0, num)
                    Loop
                    Return Encoding.Unicode.GetString(outMs.ToArray)
                End Using
            End Using
        End Using
    End Function

End Class

引用返信 編集キー/
■2756 / inTopicNo.2)  Re[1]: GZIP圧縮/解凍にて解凍ができない
□投稿者/ なちゃ (30回)-(2007/04/15(Sun) 19:42:00)
ちゃんと読んでませんが、圧縮ストリームや伸張ストリームの破棄のタイミングがまずくないですか?

いや、破棄のタイミングというより、結果を取り出すタイミングかな。

引用返信 編集キー/
■2802 / inTopicNo.3)  Re[2]: GZIP圧縮/解凍にて解凍ができない
□投稿者/ 小倉 (2回)-(2007/04/16(Mon) 19:36:00)
No2756 (なちゃ さん) に返信
> ちゃんと読んでませんが、圧縮ストリームや伸張ストリームの破棄のタイミングがまずくないですか?
>
> いや、破棄のタイミングというより、結果を取り出すタイミングかな。
>

なちゃさん回答ありがとうございます。

ご指摘の件、調べてみたら原因がわかりました。圧縮側に問題がありました。
圧縮ストリームのcompStream.Writeがすべて終わった後でcompStreamをクローズしたらうまく
いきました。
GZipStream.Write メソッド のヘルプを見ると「書き込みはすぐに実行されない場合がありま
すが、バッファ サイズに到達するか、または Flush メソッドや Close メソッドが呼び出さ
れるまでバッファリングされます。」と書いてありました。
圧縮側はよく確認していませんでした。どうもありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -