2011-01-20 36 views
1

新しいバージョンの.NETフレームワークでGzip機能を利用するためにC#アセンブリを作成していますが、他の場所でうまく使用したコードをコピーしています。C#エラー - Base-64文字列の無効な文字

この方法は、使用しているアプリケーションがアセンブリにストリームを送り、アセンブリがそれを読み込み、圧縮した後、圧縮結果を文字列として返します。その文字列は、ストリームを介してアセンブリに戻され、圧縮解除されます(通常は格納されますが、基本的なテストを実行しています)。

しかし、アセンブリに文字列を戻すと、アプリケーションのストリームから読み取られたバイト配列から文字列を読み取っている間にエラーが発生します。

private void ReadStream(IStream stream, out byte[] data) 
    { 
     using (MemoryStream writer = new MemoryStream()) 
     { 
      IntPtr rwBytes = Marshal.AllocHGlobal(4); 
      int _rwBytes = 0; 
      data = new byte[0xafc8]; 

      do 
      { 
       stream.Read(data, 0xafc8, rwBytes); 
       _rwBytes = Marshal.ReadInt32(rwBytes); 
       writer.Write(data, 0, _rwBytes); 
      } 
      while (_rwBytes > 0); 
      writer.Close(); 

      Marshal.FreeHGlobal(rwBytes); 
     } 
    } 

    public string CompressString([In, MarshalAs(UnmanagedType.AsAny)] object appStream) 
    { 
     byte[] buffer = null; 
     ReadStream(appStream as IStream, out buffer); 

     MemoryStream ms = new MemoryStream(); 
     using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true)) 
     { 
      zip.Write(buffer, 0, buffer.Length); 
     } 

     ms.Position = 0; 
     MemoryStream outStream = new MemoryStream(); 

     byte[] compressed = new byte[ms.Length]; 
     ms.Read(compressed, 0, compressed.Length); 

     byte[] gzBuffer = new byte[compressed.Length + 4]; 
     System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length); 
     System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4); 
     string str = Convert.ToBase64String(gzBuffer); 

     gzBuffer = Convert.FromBase64String(str); 
     return str; 
    } 

    public string DecompressString([In, MarshalAs(UnmanagedType.AsAny)] object appStream) 
    { 
     byte[] buffer = null; 
     ReadStream(appStream as IStream, out buffer); 

     string compressedText = Encoding.UTF8.GetString(buffer); 

     byte[] gzBuffer = Convert.FromBase64String(compressedText); 

     using (MemoryStream ms = new MemoryStream()) 
     { 
      int msgLength = BitConverter.ToInt32(gzBuffer, 0); 
      ms.Write(gzBuffer, 4, gzBuffer.Length - 4); 

      buffer = new byte[msgLength]; 

      ms.Position = 0; 
      using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress)) 
      { 
       zip.Read(buffer, 0, buffer.Length); 
      } 
     } 

     return Encoding.UTF8.GetString(buffer); 
    } 

文字列は次のようにCompressString関数から返されます:それはEncoding.UTF8.GetStringコールに戻っストリームから読み取られるとき

yK8AAB+LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99//P1xmZAFs9s5K2smeIYCqyB8/fnwfPyK+ndd5WjRplk6rxarOm6aolmmbN+04TZ/n7cdN2uTU4jwt2vSqqt8241/jR8+Pnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fOj50fPj54fPT96fvT86PnR86PnR8+Pnh89P3p+9Pzo+dHz/67nR9j86PnR86PnR8+Pnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fOj50fPj54fPT96fvT86PnR86PnR8+Pnh89/99/fjSCHz0/en70/Oj50fOj50fPj54fPT96fvT86PnR86PnR8+Pnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fOj5//7z49G8KPnR8+Pnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fOj50fPj54fPT96fvT86PnR86PnR8+Pnh89P3p+9Px///nRCH70/Oj50fOj50fPj54fPT96fvT86PnR86PnR8+Pnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fOj50fPj57/7z8/GsGPnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fP/nef/AYk/UbjIrwAA 

、それは次のとおりです。

ここでは、コードです
yK8AAB+LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99//P1xmZAFs9s5K2smeIYCqyB8/fnwfPyK+ndd5WjRplk6rxarOm6aolmmbN+04TZ/n7cdN2uTU4jwt2vSqqt8241/jR8+Pnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fOj50fPj54fPT96fvT86PnR86PnR8+Pnh89P3p+9Pzo+dHz/67nR9j86PnR86PnR8+Pnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fOj50fPj54fPT96fvT86PnR86PnR8+Pnh89/99/fjSCHz0/en70/Oj50fOj50fPj54fPT96fvT86PnR86PnR8+Pnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fOj5//7z49G8KPnR8+Pnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fOj50fPj54fPT96fvT86PnR86PnR8+Pnh89P3p+9Px///nRCH70/Oj50fOj50fPj54fPT96fvT86PnR86PnR8+Pnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fOj50fPj57/7z8/GsGPnh89P3p+9Pzo+dHzo+dHz4+eHz0/en70/Oj50fP/nef/AYk/UbjIrwAA 

これらの文字列は同じです。私は問題なくCompressString関数で前後に変換することもできます。そこにはどんな考えがありますか?これは非常に奇妙です。

+0

読み込み中にエラーが出る - それはどういう意味ですか?エラー情報? –

+2

どのようなエラーが発生しますか?スタックトレースを投稿できますか? – Justin

+1

ちょうど2つの文字列が同じであるとは限りません。 2つのバイト配列を調べましたか?文字列に変換される前の配列と、バイト配列に変換された後の配列です。私は最初と最後にいくつか余分なバイトを除いて、彼らは同一である1ドルを賭けるだろう。 – Will

答えて

0

UTF8を使用しないでください。代わりにASCIIテキストエンコーディングを使用する必要があります。あなたの文字列からバイトを取得すると、UTF文字列がエンコードされる方法のためにいくつかの余分なバイトで終わるでしょう。