2010-07-12 4 views
3

문자열을 압축하기위한 코드 샘플을보고있었습니다. 그 GZipStream 클래스를 사용하여 충분 찾으십시오. 하지만 필자는 예제 에서처럼 64 비트 문자열로 변환해야하는 이유를 알지 못합니다.GZipStream : 왜 압축 후 기본 64로 변환합니까?

using System.IO.Compression; 
using System.Text; 
using System.IO; 

public static string Compress(string text) 
{ 
byte[] buffer = Encoding.UTF8.GetBytes(text); 
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); 
return Convert.ToBase64String (gzBuffer); 
} 

또한, 내 gzBuffer이 크기 compressed.Length + 4로 초기화됩니다 이해가 안 돼요. 사실 저는 왜 우리가 마지막으로 몇 가지 진술을했는지 이해하지 못합니다. 누군가가 빛을 공유 할 수 있습니까?

추신 : 저는 컴퓨터 과학 학생이 아닙니다.

답변

3

아마도 기본 64 문자열은 일반 텍스트 (예 : 전자 메일 등의 인쇄용)로 볼 수 있도록 설정되었을 가능성이 큽니다. 편집 : 이제는 source을 볼 수 있습니다. XML 파일에 삽입하려고하므로 일반 텍스트 여야합니다.

다음 줄 때문에 크기가 필요합니다. - BlockCopy. 그것은 4 바이트에서 gzBuffer로 복사를 시작합니다. (네 번째 인수는 대상 버퍼로의 바이트 오프셋입니다.) 두 번째 BlockCopy는 압축 된 문자열의 길이를 대상 버퍼의 처음 4 바이트에 넣습니다. 왜 여기에 길이가 필요한지 잘 모르겠지만 상응하는 디코드 루틴이있을 수 있습니다.

편집 : 길이는 압축 해제 루틴에서 사용되어 압축 해제 된 바이트 버퍼의 길이를 프로그램이 알 수 있도록합니다.

+0

그래서 변환은 출력의 크기에 영향을 미치지 않을까요? 그리고 abt tht 루틴 디코딩 - 네, 하나 있습니다! 4 바이트의 길이를 저장하는 목적은 무엇입니까? 필요한가요? 추신; 코드는 [here] (http://www.csharphelp.com/2007/09/compress-and-decompress-strings-in-c/)에서 가져 왔습니다. – deostroll

관련 문제