2011-09-15 19 views
0

プログラムで圧縮方式をデータに適用すると、この問題は全面的に解決されています...多くのサイトを検索していますが、私にとっては何もしていないようです。私の最新の発見のためにインプログラムの圧縮/解凍

、私が持っている: Simple object to byte[] & byte[] to object methods(I prefer these) & A rather more complex class extension

彼らの両方が非常によく圧縮するが、解凍時にエラーをスローするように見えます。

私の目標: - >ファイルをメモリに圧縮して書き込みます。 - >ファイルから読み取り、データを圧縮解除します。

これを使用する主なプログラムは、オブジェクトがすべて< CARD>タグで区切られた文字列です。各オブジェクトには、DATA>タグ<で区切られた6つの文字列と1つの画像(文字列に変換された画像)が含まれています。

私は、これはコードです...最後に適用する前に実験する簡単な「試験」プログラムを書いた:

private void btnCompress_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      Encoding enc = new UTF32Encoding(); 
      richTextBox1.Text = enc.GetString(CompressionStyle2.Compress(richTextBox1.Text)); 
     } 
     catch (Exception ex) { MessageBox.Show(ex.ToString()); } 
    } 

    private void btnDecompress_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      Encoding enc = new UTF32Encoding(); 
      richTextBox1.Text = (string)CompressionStyle2.Decompress(enc.GetBytes(richTextBox1.Text)); 
     } 
     catch (Exception ex) { MessageBox.Show(ex.ToString()); } 
    } 

(私はダミーのプログラムの効率化についてはあまり気にしない - 私はないようにしようけれどもやっかいな仕事をする)

私は何が間違っているのでしょうか?

答えて

0

バイナリデータをテキストボックスに保存しようとしています。これは、最初のNULで切り捨てられ、おそらくデータを破損させる可能性があります(バックスペース文字が保存されないなど)。

圧縮された出力をテキストとして扱う必要がある場合は、Base64などを使用します。

テキストボックスをスキップして、バイナリファイルを使用してみてください。

+0

私は初めてのことでしたが、今日の私の最初のエラーのポイントまで進んでいます: "ベース64文字列には、非ベース64文字、2つ以上のパディング文字、または非ホワイトパディング文字の中に空白文字が含まれています。それはどちらかといえばあまり圧縮していないようです...私はこれを最近試みました:(文字列)CompressionStyle2.Decompress(CompressionStyle2.Compress(temp)) – TekuConcept

+0

@ Teeku:あなたはBase64の機能を後方に使ったように思えます。圧縮後にエンコードし、解凍する前にデコードする必要があります。 –

+0

これは動作します: ファイルから:MemoryStream main = new MemoryStream(); file.CopyTo(main);文字列temp =(文字列)解凍(main.GetBuffer()); ファイルへ:BinaryWriter writer = new BinaryWriter(file); writer.Write(圧縮(データ)); – TekuConcept

0

enc.GetString()は、渡されたデータが実際にはエンコードされた文字列である場合にのみ機能します。

あなたのケースでは、エンコードされた文字列をそのメソッドに渡すことはありません。圧縮ステップの出力を含むバイト配列を渡しています。圧縮により、 "一束のバイト"が生成されます。そして、バイトセットから文字列を生成することはできません。

あなたが間違っていることは、バイト配列がバイト配列であると仮定しており、好きなバイト配列でEncoding.GetString()を呼び出すことができます。そのようには機能しません。

Ben Voigt氏は、テキストボックスに表示する前に、何らかの形式でバイト配列をエンコードする必要があると述べています。バイト配列を表示可能な文字列に変換する場合は、16進エンコードのステップ、またはbase64などでエンコードします。

次に、解凍​​したいときは、逆の操作(デコード)を行う必要があります。

関連する問題