C#/.NET Framework에서 압축을 동기식(실시간)으로 수행하는 방법

소개



일반적인 압축 스트림은, Close() 메소드인가 불릴 때까지 버퍼링 해 버려, 리얼타임인 상호 통신이 필요한 경우 등에는 사용할 수 없다.



zebedee 등의 통신을 압축해 주는 툴의 호환 프로그램은 만들기 어려울 것이다.

Java의 경우 SYNC_FLUSH 모드가 JDK7에서 제공되기 때문에 , 그것을 사용하면 좋지만 .NET Framework의 GZipStream 등에는 제공되지 않는다.

그러나, zlib.NET.dll 에는 SYNC_FLUSH 모드가 실장되고 있으므로, 그것을 사용하면 좋다고 생각한다.

버전



기본적으로 ver1.04의 이야기.

사용법(기본)



zlib.NET의 demo 폴더를 보면 알겠지만 일단 메모

zlib.ZOutputStream 클래스도 zlib.ZInputStream 클래스도 페이스가 되는 스트림만의 인수의 constructor 의 경우는, 해동
페이스가 되는 스트림과, 압축 레벨의 2 인수의 생성자의 경우는, 압축

후에는, zlib.ZOutputStream#FlushMode 에 zlib.zlibConst.Z_SYNC_FLUSH 를 지정할 뿐.

사용법 (zlib.ZInputStream의 함정)



이것, 왜인가 System.IO.BinaryReader 클래스를 계승하고 있다.
그럼에도 불구하고, BinaryReader 클래스의 각종 메소드는 구현하고 있지 않다! ! (소스 코드를 보면 알 수 있습니다)

유일한 구현이 Read() 와 왠지 소문자 시작의 read(byte[] b, int off, int len) 이다.

글쎄, zlib.ZInputStream 클래스를 Stream으로 감싸는 래퍼 클래스를 자작하고, 그것의 Read() 를 read() 에 연결하면 좋을 뿐인 이야기이지만, 나는 BinaryReader 로서 (BinaryReader.ReadByte()를) 그대로 사용하고 있어 "해동하지 말아라"라고 며칠 고민했기 때문에, 메모로서 남겨 둘게.

즉, zlib.ZInputStream 는 BinaryReader 를 계승하고 있지만, Reader 로서는 불충분하기 때문에, 각자 Stream 의 래퍼로서 감싸고 들고 나서 다시 Reader 에 감싸 주면 좋다고 생각한다.

BouncyCastle/C#에서도 가능



BouncyCastle/C# 하지만 할 수 있었다.

BouncyCastle/C# 의 Org.BouncyCastle.Utilities.Zlib.ZOutputStream 클래스/Org.BouncyCastle.Utilities.Zlib.ZInputStream 클래스의 FlushMode 속성이 그것.
이 프로퍼티에 Org.BouncyCastle.Utilities.Zlib.JZlib 의 Static 치를 주면 된다고 생각한다.
Org.BouncyCastle.Utilities.Zlib.JZlib.Z_SYNC_FLUSH 라든지를 주면 좋다고 생각한다.

Java에서 캡처



위쪽에 「 Java의 경우 SYNC_FLUSH 모드가 JDK7에서 제공되기 때문에 」라고 쓰고 있지만, Java의 경우는,
DeflaterOutputStream 등 뿐만이 아니라, java.util.zip.GZIPOutputStream 에도 Sync_Flush (동기적 압축)가 붙어 있다. ( 생성자의 두 번째 인수에 주목)

이상

좋은 웹페이지 즐겨찾기