2010-11-25 4 views
0

인터넷에서 문자열 압축을 위해 다음 코드를 만들었습니다. 간단한 문자열을 압축하면 반환 값이 매우 다릅니다. 예를 들어문자열 압축 결과를 문자열로

는 압축 ("ABC")는 반환 "AwAAAB + LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee ++ 997o7nU4n99 // P1xmZAFs9s5K2smeIYCqyB8/fnwfPyKyyfT/AcJBJDUDAAAA"

내가 간단한 문자열 결과를 취할 수 있습니다. 사용중인

감사

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

무엇이 질문입니까? – LukeH

답변

0

코드는 압축 정말 큰 문자열을위한 것입니다. GZip 압축 알고리즘을 사용하여 소스 문자열을 압축 한 다음 BASE64 인코딩을 사용하여 읽을 수있게 만들거나 사용 가능하게 만들 수 있습니다.

확장 원본 문자열 ~ 최대 1.33 배 (8 비트 심볼은 다음 심볼에 대해 6 비트 + 2 비트 오버 플로우로 인코딩 됨). 따라서 센스 문자열을 만들려면 소스 길이에서 적어도 70 % 압축해야합니다.

해당 인코딩을 사용할 때 예상되는 결과가 예상됩니다. 결과는 (코드의 마지막 줄 참조) base64로하기 때문에

, 당신의 질문은 당신이 "단순한 문자열 결과"확인

+0

예를 들어, "3F2504E0-4F89-11D3-9A0C-0305E82C3301"과 같이 Guid 값을 압축하면 예상 반환 값은 "7QDBkvCA1 + B9K/U0vrQx1A--"입니다. 그러나 compress 메서드는 "H4sIAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1 + B0oQiAYBMk2JBAEOzBiM3mkuwda ..."를 반환합니다. "7QDBkvCA1 + B9K/U0vrQx1A--"값을 어떻게 취할 수 있습니까? – user517601

+0

예상 한 이유는 무엇입니까? GZip으로 압축하면 압축에 사용되는 Zip 헤더와 사전이 결과에 포함됩니다. 따라서 기본 데이터를 확장 할 수 있습니다. 특히 너무 짧습니다. –

+0

아마도'Convert.ToBase64String (guid.ToByteArray())'를 원하겠습니까? 그러나 원하는 경우 인코딩없이 원래의 문자열 표현을 guid 전달할 수 있습니다. –

0

무엇을 의미하는 정의하십시오 대답합니다.

0

압축은 항상 몇 가지 이유에 대한 작은 출력을 초래하지 않습니다

  1. 가 입력이 완전히 무작위 수 있습니다, 경우 대부분의 압박은 아무것도 압축하지 않습니다있는,하지만 여전히 압축 해제 "를 저장해야 명령". 이러한 데이터를 압축 한 결과는 데이터 + 지시 사항입니다.
  2. 입력에 사용 된 압축 알고리즘으로 검색된 기능이 없습니다. 이는 이전의 압축 알고리즘과 매우 유사합니다. 단, 사용 된 압축 알고리즘 (Gzip의 경우)에 따라 달라집니다.
  3. 아주 작은 입력입니다. 입력 값이 작을수록 압축성 세그먼트를 찾을 기회가 적어 지므로 무작위가 아닌 의사 랜덤 입력을 얻을 확률이 높습니다. .

Base64는 여기서 중요한 점입니다. 그렇지만 일반적으로 압축에 대한 이러한 작은 사실을 잊지 마십시오.

관련 문제