2016-11-10 1 views
0

Compress and decompress string in c#에 C#의 문자열 압축 용 게시물이 있습니다.GZipStream은 원본보다 텍스트를 크게 만듭니다

나 자신에 대해 동일한 코드를 구현했지만 반환 된 텍스트 내 거의 두 배 : O 나는이 같은 크기 87와 JSON에 그것을 시도했습니다

:

{ "G": "82f88ff5-4143-46ef-86cc-a19910f4a6b5는", "U"는 "df39e3c7-ffd3-4829-a9cd-27bfcbd4403a은"}

결과 168이다

H4sIAAAAAAAEAC2NUQ6DIBQE5yx8l0QFqfQCnqAHqKCXaHr3jsaQ3TyYfcuXwKpeamHi0Bf9YCaSGVW6psLua5QWmifykVbPyCDJ3gube4GHet + tXZZM7Xrj6d7Z3u/W8896dVVpd5rMbCaa3k1k25M88OMPcjDew64AAAA =

내가 ASCII로 유니 코드를 변경했지만 결과는 여전히 너무 큰 (128)

H4sIAAAAAAAEAA3KyxGAMAgFwF44y0w + JAEbsAILICSvCcfedc/70EUnaYEq0FiyVJa + wdoj2LNZThDvs9FB918Xqu0ag4H1Vy3GbrG4jImYSyRVp/cDp8EZE1cAAAA =

public static string Compress(this string s) 
{ 
    var bytes = Encoding.ASCII.GetBytes(s); 
    using (var msi = new MemoryStream(bytes)) 
    using (var mso = new MemoryStream()) 
    { 
     using (var gs = new GZipStream(mso, CompressionMode.Compress)) 
     { 
      msi.CopyTo(gs); 

     } 
     return Convert.ToBase64String(mso.ToArray()); 
    } 
} 
+0

Base64로 변환하기 전에 바이트 수를 비교 했습니까? 내가 올바르게 기억하면 Base64가 각 6 비트 청크를 문자 https://en.wikipedia.org/wiki/Base64 – KMoussa

+0

@ KMoussa에게 답장 해 주셔서 감사합니다. 내 코드를 추가했습니다 –

+0

예, ToBase64를 사용하고 있지만 System.Text.Encoding.ASCII.GetString (byteArray)도 테스트했습니다. –

답변

1

Gzip은 압축뿐만 아니라 전체 파일 형식입니다. 즉, 일반적으로 크기와 관련하여 무시할 수있는 구조가 추가됩니다. 그러나 작은 문자열을 압축하면 전체 gzip 스트림을 날려 보낼 수 있습니다.

예를 들어 표준 GZIP 헤더는 10 바이트이며 바닥 글의 길이는 8 바이트입니다.

따라서 gzip 압축 결과를 원시 형식 (압축되지 않은 base64로 인코딩 된 형식이 아닌)으로 가져 오면 95 바이트가 표시됩니다.

따라서 헤더 및 유머에 대한 18 바이트는 이미 출력의 거의 20 %를 차지합니다!

+0

로버트 감사합니다. 그래서 대신 무엇을해야합니까? –

+0

데이터를 문자열로 변환하지 말고 실제 형식을 사용하십시오. 데이터에는 예를 들어 UUID처럼 보이는 두 개의 데이터가 들어 있습니다. 문자열 표현에서 그들은 2 바이트 표현 (단지 숫자)으로 36 바이트입니다. 단지 16 바이트입니다. 또는 추가 데이터를 추가하지 않는 압축 알고리즘을 찾으십시오 (단, 10-15 % 이상의 압축은 gzip으로 표시되지 않습니다). – Robert

관련 문제