C#에서 문자열 압축 및 압축 해제

Saad Aslam 2023년10월12일
  1. 압축의 정의
  2. C#의 .NET 데이터 압축 알고리즘
  3. GZip을 사용하여 C#에서 문자열 압축
  4. GZip을 사용하여 C#에서 문자열 압축 풀기
C#에서 문자열 압축 및 압축 해제

이 기사에서는 System.IO 파일 시스템에 압축 방법을 적용하는 방법을 보여줍니다.

Compression 네임스페이스는 문자열 값을 압축 및 압축 해제할 수 있습니다. 값을 압축하면 바이트 크기가 상당히 줄어듭니다.

압축의 정의

물리학에서 압축은 질량에 안쪽으로 작용하는 힘으로 인한 크기 감소를 나타냅니다. 데이터 압축에 대해 이야기할 때 식별할 수 있는 콘텐츠 손실 없이 데이터를 보다 압축된 형식으로 변경하는 것을 말합니다.

데이터 압축은 알고리즘을 사용하여 인간이 실용적인 만큼 이미 존재하는 정보를 인코딩하는 프로세스입니다. 다양한 알고리즘의 효율성은 정도에 따라 다릅니다.

그러나 일반적으로 데이터를 압축하는 데 필요한 시간이나 CPU에 필요한 처리 능력의 양 측면에서 절충안을 포함합니다.

C#의 .NET 데이터 압축 알고리즘

여러 대체 압축 방법이 있지만 이 논의를 위해 GZip에 집중하겠습니다. SharpZipLib과 같은 타사 라이브러리를 활용하는 것이 가능하지만 .NET Framework 고유의 GZipStream 클래스를 사용하고 System.IO.Compression 네임스페이스에 있습니다.

또한 문자열 데이터 압축 및 압축 해제를 강력하게 강조합니다. 바이트 배열 및 스트림과 같은 다른 종류를 처리하는 절차는 다소 수정될 것입니다.

GZip을 사용하여 C#에서 문자열 압축

GZipStream의 가장 기본적인 구현에서는 사용자가 기본 스트림과 압축 옵션을 입력으로 제공해야 합니다. 압축 모드는 데이터를 압축할지 압축 해제할지 여부를 지정합니다. 기본 스트림은 압축 방법에 따라 변경됩니다.

아래 코드는 메모리 스트림을 기본 출력 스트림으로 사용합니다. 출력 스트림은 GZipStream 컨테이너에 래핑됩니다.

입력 데이터를 GZipStream으로 보내면 데이터는 압축된 형태로 파이프라인을 따라 출력 스트림으로 이동합니다. 자체 using 블록에 Write 작업을 배치하여 데이터를 정리할 수 있습니다.

save() 메소드 코드는 이 기사 끝부분의 소스 코드에서 사용할 수 있습니다.

public static byte[] Compress(string str) {
  var bytes = Encoding.UTF8.GetBytes(str);

  using (var msi = new MemoryStream(bytes)) using (var memoryStream = new MemoryStream()) {
    using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress)) {
      save(msi, gZipStream);
    }

    return memoryStream.ToArray();
  }
}

GZip을 사용하여 C#에서 문자열 압축 풀기

데이터 압축을 풀 때 압축이 풀린 스트림이 입력 스트림이 됩니다. GZipStream은 계속해서 이를 묶지만 GZipStream에서 데이터를 읽으면 압축된 데이터가 압축되지 않은 데이터로 변환되도록 흐름이 반대로 됩니다.

CompressionMode.Decompress 모드는 문자열의 압축을 푸는 데 사용됩니다.

public static string Decompress(byte[] bytes) {
  using (var msi = new MemoryStream(bytes)) using (var memoryStream = new MemoryStream()) {
    using (var gZipStream = new GZipStream(msi, CompressionMode.Decompress)) {
      save(gZipStream, memoryStream);
    }

    return Encoding.UTF8.GetString(memoryStream.ToArray());
  }
}

C#에서 문자열 압축 및 압축 해제를 위한 완전한 소스 코드

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

class HelloWorld {
  public static void save(Stream source, Stream destination) {
    byte[] bytes = new byte[4096];

    int count;

    while ((count = source.Read(bytes, 0, bytes.Length)) != 0) {
      destination.Write(bytes, 0, count);
    }
  }

  public static byte[] Compress(string str) {
    var bytes = Encoding.UTF8.GetBytes(str);

    using (var msi = new MemoryStream(bytes)) using (var memoryStream = new MemoryStream()) {
      using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress)) {
        save(msi, gZipStream);
      }
      return memoryStream.ToArray();
    }
  }

  public static string Decompress(byte[] bytes) {
    using (var msi = new MemoryStream(bytes)) using (var memoryStream = new MemoryStream()) {
      using (var gZipStream = new GZipStream(msi, CompressionMode.Decompress)) {
        save(gZipStream, memoryStream);
      }

      return Encoding.UTF8.GetString(memoryStream.ToArray());
    }
  }

  static void Main(string[] args) {
    byte[] string1 = Compress("stringstringstringstringstringstringstringstring");
    Console.WriteLine("Zipped Size: " + string1.Length + " bytes");
    string string2 = Decompress(string1);
    Console.WriteLine("Unzipped Size: " + string2.Length + " bytes");
  }
}

출력:

Zipped Size: 29 bytes
Unzipped Size: 48 bytes
작가: Saad Aslam
Saad Aslam avatar Saad Aslam avatar

I'm a Flutter application developer with 1 year of professional experience in the field. I've created applications for both, android and iOS using AWS and Firebase, as the backend. I've written articles relating to the theoretical and problem-solving aspects of C, C++, and C#. I'm currently enrolled in an undergraduate program for Information Technology.

LinkedIn

관련 문장 - Csharp String