2011-01-20 3 views
1

새 버전의 .NET Framework에서 GZip 기능을 활용하기 위해 C# 어셈블리를 작성 중이며 다른 곳에서 성공적으로 사용한 코드를 복사하고 있습니다.C# 오류 - Base-64 문자열의 문자가 올바르지 않습니다.

우리가 사용하는 응용 프로그램이 스트림을 어셈블리에 공급하고 어셈블리가이를 읽고 압축 한 다음 압축 된 결과를 문자열로 반환합니다. 그런 다음 문자열을 압축 해제 할 스트림을 통해 어셈블리에 다시 넣습니다 (일반적으로 저장되지만 기본 테스트 만 실행 함).

그러나 문자열을 어셈블리에 다시 공급할 때 응용 프로그램의 스트림에서 읽은 바이트 배열에서 문자열을 읽는 동안 오류가 발생합니다. 문자열로 CompressString 함수에서 반환

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); 
    } 

가 :

그것이 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

두 개의 문자열이 똑같아 보이는 것만으로 그 문자열을 의미하는 것은 아닙니다. 두 개의 바이트 배열을 조사 했습니까? 하나는 문자열로 변환되기 전에 하나는 바이트 배열로 다시 변환 된 것입니다. 나는 처음이나 끝 부분에 여분의 몇 바이트를 제외하고는 동일하다는 것을 알았습니다. – Will

답변

0

UTF8을 사용하지 마십시오. 대신 ASCII 텍스트 인코딩을 사용해야합니다. 문자열에서 바이트를 가져 오면 UTF 문자열이 인코딩되는 방식으로 인해 추가 바이트로 끝납니다.

관련 문제