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 (동기적 압축)가 붙어 있다. ( 생성자의 두 번째 인수에 주목)
이상
Reference
이 문제에 관하여(C#/.NET Framework에서 압축을 동기식(실시간)으로 수행하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tomoki0sanaki/items/68b7ca38b8fefa199363텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)