티스토리 뷰
프로그램을 개발하다 보면 압축 상태의 자료를 읽거나, 아니면 자료를 압축 상태로 저장해야 하는 경우가 있다. 장기간 보관이나, 통신량 최소화, 보안 등의 필요와 연관되는 경우가 대부분이다. 이런 경우 외부 프로그램을 통해서 압축 및 압축 해제를 수행시키고 그 결과를 사용하는 방법도 있지만 프로그램의 융통성도 떨어지고 좀 더 효율성이 높은 프로그램을 제작하기에는 무리가 있다.
이런 경우 압축 라이브러리를 사용하면 프로그램의 융통성도 높이고 다양한 아이디어를 프로그램에 적용할 수 있다. 또한 .Net 전용 라이브러리를 사용하면 별도의 C/C++ 라이브러리를 사용하지 않아도 되므로 개발 및 배포 과정이 더 간편해진다. 비주얼 스튜디오에서 NuGet 도구를 활용하여 라이브러리를 설치할 수도 있겠으나 많은 경우 라이선스를 같이 배포해야 되는 등 약간의 제한들이 있는 경우가 대부분이었다. 그래서 .Net 전용 라이브러리이면서도 상용 프로그램에서도 사용할 수 있고 배포에 제약이 거의 없는 라이브러리를 찾아보았는데 위의 그림 같은 ZLIB.NET Free라는 패키지가 있었다. 이 회사에서 배포하고 있는 다른 라이브러리들도 배부분 이 라이브러리를 기반으로 하고 있는 것으로 보였다.
https://www.componentace.com/zlib_.NET.htm
위의 주소에 가서 다운로드하면 소스 코드 및 예제와 함께 라이브러리를 다운로드할 수 있고, 라이브러리만 받고 싶다면 아래의 첨부를 사용하면 된다.
상용 프로그램 및 소스 코드를 배포하지 않는 프로젝트에서 사용해도 무방하다. 상당히 개방적인 BSD 라이선스와 유사한 라이선스이다.
public static byte[] Compress(byte[] data, int datalen)
{
using (MemoryStream outMemoryStream = new MemoryStream())
using (zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outMemoryStream, zlib.zlibConst.Z_DEFAULT_COMPRESSION))
using (Stream inMemoryStream = new MemoryStream(data))
{
CopyStream(inMemoryStream, outZStream);
outZStream.finish();
return outMemoryStream.ToArray();
}
}
public static byte[] decbuf = null;
public static int Decompress(byte[] data, int decbuf_len)
{
using (MemoryStream outMemoryStream = new MemoryStream())
using (zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outMemoryStream))
using (Stream inMemoryStream = new MemoryStream(data))
{
CopyStream(inMemoryStream, outZStream);
outZStream.finish();
decbuf = outMemoryStream.ToArray();
return decbuf.Length;
}
}
.......................
// 압축
byte[] zipdata = Compress(text_buf, text_pt);
txtf[fidx].Seek(ztext_pt, SeekOrigin.Begin);
txtf[fidx].Write(zipdata, 0, zipdata.Length);
.......................
//압축 해제
byte[] org = File.ReadAllBytes(jfbfilename);
int orglen = Decompress(org, org_length);
.......................
위의 코드는 특정 문자열 버퍼를 압축해서 파일에 저장하는 예제와 압축 파일을 읽어 압축 해제하는 예제이다.
'프로그래밍' 카테고리의 다른 글
C# 배포시 난독화를 해야 할까? - ConfuserEx 사용법 (11) | 2020.05.05 |
---|---|
C# 스트롤바 컨트롤 사용하기 (0) | 2020.05.02 |
C# 32비트와 64비트를 모두 지원하는 SQLite 응용 프로그램 개발하기 (0) | 2020.04.30 |
C# ColorDialog 대체하기, 웹 전용 색상 선택하기 (0) | 2020.04.29 |
C# 자주쓰는 타입 변환 - byte, string, int (0) | 2020.02.19 |