2011-01-20 143 views
1

我正在編寫一個C#程序集以利用.NET框架的新版本中的GZip功能,並且正在複製其他地方已成功使用的代碼。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函數返回:

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 

當從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 

這些字符串是相同的。我甚至可以在CompressString函數中來回轉換,沒有任何問題。有什麼想法嗎?這很奇怪。

+0

閱讀時發現錯誤 - 這是什麼意思?任何錯誤信息? – 2011-01-20 18:20:47

回答

0

不要使用UTF8,應該使用ascii文本編碼。當你從你的字符串中獲取字節時,由於UTF字符串被編碼的方式,你最終會得到一些額外的字節。