圧縮コマンドの代替としての StreamRelay.NET.exe

---
### 圧縮コマンドの代替

圧縮コマンドは、入力ファイル→(圧縮された)出力ファイルなので、
「local」の入力ソース(実体)にファイル、「remote」の出力ソース(実体)に圧縮ファイルとすればいい。
そして、圧縮などのデータ加工処理は、netstreamスキーム・プロキシのオプションとして実装している。
よって、圧縮時は、出力側のストリームに圧縮指定をすればいい。

つまり、アルゴリズムとして gzip を選択する場合は、

入力ソース(実体)と、出力ソース(実体)を↓のように指定する
`-LocalInputFile a.txt -RemoteOutputFile a.txt.gz`

そして、プロキシオプションを↓のように指定する
`-RemoteProxy netstream:///?gzipCompress`

よって、gzip圧縮
`gzip.exe a.txt`
⇔
`StreamRelay.NET.exe -LocalPort 0 -RemotePort 0 -LocalInputFile a.txt -RemoteOutputFile a.txt.gz -RemoteProxy netstream:///?gzipCompress`

---
### 伸張コマンドの代替

伸張コマンドは、(圧縮された)入力ファイル→(伸張された)出力ファイルなので、
「local」の入力ソース(実体)に圧縮ファイル、「remote」の出力ソース(実体)に結果ファイルとすればいい。
そして、圧縮などのデータ加工処理は、netstreamスキーム・プロキシのオプションとして実装している。
よって、伸張時は、入力側のストリームに伸張指定をすればいい。

つまり、アルゴリズムとして gzip を選択する場合は、

入力ソース(実体)と、出力ソース(実体)を↓のように指定する
`-LocalInputFile a.txt -RemoteOutputFile a.txt.gz`

そして、プロキシオプションを↓のように指定する
`-LocalProxy netstream:///?gzipDeCompress`

よって、gzip伸張
`gzip.exe -d a.txt`
⇔
`StreamRelay.NET.exe -LocalPort 0 -RemotePort 0 -LocalInputFile a.txt.gz -RemoteOutputFile a.txt.out -LocalProxy netstream:///?gzipDeCompress`

### 圧縮/伸張アルゴリズムの一覧

`StreamRelay.NET.exe -ListFilter`

<dl>
 <dt>StreamRelay.NET.exe/StreamRelay.NET.x86.exe に直接実装
  <dd>
   <ul>
    <li>gzipCompress と gzipDeCompress (<a href="https://msdn.microsoft.com/ja-jp/library/system.io.compression.gzipstream(v=vs.110).aspx">System.IO.Compression.GZipStream クラス</a>) 
    <li>deflateCompress と deflateDeCompress (<a href="https://msdn.microsoft.com/ja-jp/library/system.io.compression.deflatestream(v=vs.110).aspx">System.IO.Compression.DeflateStream クラス</a>)
   </ul>
 <dt>Plugin.BaseFilterStream.dll
  <dd>
   <ul>
    <li>BinHexdecompress と BinHexcompress (BinHEX 符号化用の簡易的な圧縮アルゴリズム)
   </ul>
 <dt>Plugin.7zip.dll と <a href="https://sevenzipsharp.codeplex.com/">SevenZipSharp.dll</a>
  <dd>
   <ul>
    <li>LZMADeCompress と LZMACompress[=UseTempFile]
   </ul>
 <dt>Plugin.BouncyCastle.Crypto.dll と <a href="http://www.bouncycastle.org/csharp/">BouncyCastle.Crypto.dll</a>
  <dd>
   <ul>
    <li>BC_Bzip2DeCompress と BC_Bzip2Compress
    <li>BC_DeflateDeCompress と BC_DeflateCompress
   </ul>
 <dt>Plugin.CSharpCode.SharpZipLib.dll と <a href="http://icsharpcode.github.io/SharpZipLib/">SevenZipSharp.dll</a>
  <dd>
   <ul>
    <li>SZ_BZip2DeCompress とSZ_BZip2Compress
    <li>SZ_GZipDeCompress と SZ_GZipCompress
   </ul>
 <dt>Plugin.LZ4.dll と <a href="https://lz4net.codeplex.com/">LZ4.dll</a>
  <dd>
   <ul>
    <li>LZ4DeCompress と LZ4Compress
   </ul>
 <dt>Plugin.Snappy.dll と <a href="https://snappy4net.codeplex.com/">SnappyPI.dll/SnappyDL.x64.dll/SnappyDL.x86.dll</a>
  <dd>
   <ul>
    <li>SnappyDeCompress[=UseTempFile] と SnappyCompress[=UseTempFile]
   </ul>
 <dt>Plugin.xz.dll と <a href="https://github.com/RomanBelkov/XZ.NET">XZ.NET.dll/liblzma.dll/liblzma64.dll</a>
  <dd>
   <ul>
    <li>XZDeCompress と XZCompress
   </ul>
 <dt>Plugin.ZstdNet.dll と <a href="https://github.com/skbkontur/ZstdNet">ZstdNet.dll/zstdlib_x64.dll/zstdlib_x86.dll</a>
  <dd>
   <ul>
    <li>ZstdDeCompress[=UseTempFile] と ZstdCompress[=UseTempFile]
   </ul>
 <dt>Plugin.Brotli.dll と <a href="http://www.nuget.org/packages/Brotli.NET/">Brotli.NET.dll/brotli64.dll/brotli32.dll</a>
  <dd>
   <ul>
    <li>BrotliDeCompress と BrotliCompress
   </ul>
 <dt>Plugin.zlib.NET.dll と <a href="http://www.componentace.com/zlib_.NET.htm">zlib.NET.dll</a>
  <dd>
   <ul>
    <li>zlibDeCompress と zlibCompress
    <ul>
     <LI>SYNC_FLUSHなので、リアルタイム圧縮に使えると思う
    </ul>
   </ul>
</dl>

---
### 圧縮/伸張アルゴリズムのリアルタイム性

ver2.3.1.0 現在、リアルタイム性のあるアルゴリズムはなくて、基本的に全データを受信してから圧縮/伸張処理を実施するので、ソースがファイルなど起動時に全データが存在するような場合には有効だが、ソースが通信のような実行しながら入力データが生成されるようなタイプには向かないだろう。

ver3.5.0.0 で zlib.NET.dll を同梱し、そのプラグインラッパPlugin.zlib.NET.dllを同梱した。これはzlibのSYNC_FLUSHモードなので、リアルタイム圧縮として使えるはず(zlibCompressとzlibDeConpress)。

`zlibCompress=SYNC_FLUSH`

みたいな感じ。

ver3.5.0.0 では BouncyCastle/C# 版でもリアルタイム圧縮ができることが分かったので、それを実装した。

`BC_DeflateCompress=SYNC_FLUSH`

みたいな感じ。

### 圧縮/伸張アルゴリズム(Zlib/Deflate/Gzip)(ver3.5.0.0以降)

[ver3.5.0.0以降、Zlib/Deflate/Gzip を厳密にした。](http://rocketeer.dip.jp/sanaki/free/free119.htm#DEFLATEZLIBGZIP)

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)