Python:を膨らませ、Deflate実装
-
11-09-2019 - |
質問
私はインターフェースサーバーを必要とすることに送られるデータは圧縮 Deflate アルゴリズム(ハフマン符+LZ77とともにデータを送信することが必要です を膨らませ.
知っているPythonを含むZlib、図書館にZlib支援の通話を を膨らませ や Deflate, が、これらが提供するものではありませんのPython Zlibモジュールです。で提供 圧縮 や 解凍, してしまっているんですけど電話をかけるなどの
result_data = zlib.decompress( base64_decoded_compressed_string )
って請求金額は異なります。エラー:
Error -3 while decompressing data: incorrect header check
Gzipすものではありませんよという、時に通話など
result_data = gzip.GzipFile( fileobj = StringIO.StringIO( base64_decoded_compressed_string ) ).read()
Iのエラー:
IOError: Not a gzipped file
ある意味でのデータとしては デフレートした為替レー ファイルではない Gzipped ファイルです。
今があることをご存知の方 Deflate 実施可能(Pyflateが分かりませんの を膨らませ 実装されます。
ことがいくつかのオプション:
- 見既存の実施(理想) を膨らませ や Deflate Python
- 自分でPythonの拡張zlib cライブラリが含まれ を膨らませ や Deflate
- 通話したかをできるから実行コマンドラインなどのRubyスクリプトから を膨らませ/Deflate 電話がzlibは完全に包まれたRuby)
- ?
を目指している溶液が不足を解いに感謝する見識、建設的な意見、アイディア
追加情報:の結果deflating(エンコード)をデコード文字列であることを目的とし、私は必要とされているので、このような結果として、以下のスニペットのC#コードでは、入力パラメータの配列であるUTFバイトに対応するデータ圧縮:
public static string DeflateAndEncodeBase64(byte[] data)
{
if (null == data || data.Length < 1) return null;
string compressedBase64 = "";
//write into a new memory stream wrapped by a deflate stream
using (MemoryStream ms = new MemoryStream())
{
using (DeflateStream deflateStream = new DeflateStream(ms, CompressionMode.Compress, true))
{
//write byte buffer into memorystream
deflateStream.Write(data, 0, data.Length);
deflateStream.Close();
//rewind memory stream and write to base 64 string
byte[] compressedBytes = new byte[ms.Length];
ms.Seek(0, SeekOrigin.Begin);
ms.Read(compressedBytes, 0, (int)ms.Length);
compressedBase64 = Convert.ToBase64String(compressedBytes);
}
}
return compressedBase64;
}
走ります。純コード文字列"deflateとエンコードme"の結果
7b0HYBxJliUmL23Ke39K9UrX4HShCIBgEyTYkEAQ7MGIzeaS7B1pRyMpqyqBymVWZV1mFkDM7Z28995777333nvvvfe6O51OJ/ff/z9cZmQBbPbOStrJniGAqsgfP358Hz8iZvl5mbV5mi1nab6cVrM8XeT/Dw==
が"deflateとエンコードme"をPython Zlib.圧縮()をbase64エンコードの結果は"eJxLSU3LSSxJVUjMS1FIzUvOT0lVyE0Fafxhb6k=".
こzlib.圧縮()が実装と同じアルゴリズムの標準Deflateアルゴリズムです。
詳細情報:
最初の2バイトできます。純deflateデータ("7b0HY..."、b64復号は0xEDBD、対応しておりませんのGzip圧縮データ(0x1f8b),BZip2(0x425A)データ、またはZlib(0x789Cデータが得られます。
最初の2バイトのPythonの圧縮データ("eJxLS..."、b64復号は0x789C.これはZlibヘッダを表します。
解決
の原deflateとを膨らませずに、ヘッダおよびチェックサムは、以下のようなものが挙げられ必要とう:
にdeflate/圧縮:ストリップの最初のバイト(ヘッダ)の最後のバイト(チェックサム).
に膨らみ/解凍:ある第二引数ウィンドウサイズです。この値は負で抑制できます。ここでは私のやり方では現在、base64エンコーディング/復号と正常に動作してい:
import zlib
import base64
def decode_base64_and_inflate( b64string ):
decoded_data = base64.b64decode( b64string )
return zlib.decompress( decoded_data , -15)
def deflate_and_base64_encode( string_val ):
zlibbed_str = zlib.compress( string_val )
compressed_string = zlibbed_str[2:-4]
return base64.b64encode( compressed_string )
解決
この追加をMizardXの答えは、一部の説明。
見 http://www.chiramattel.com/george/blog/2007/09/09/deflatestream-block-length-does-not-match.html
による RFC1950年, は、zlibストリームのデフォルトの方法では:
- 2バイトヘッダ(例:0x78 0x9C)
- るdeflateストリームを参照してください RFC1951年
- るAdler-32チェックサムされた、圧縮解除されたデータ(4バイト)
C# DeflateStream
作品(さん)deflateストリームです。MizardXのコードを語っていzlibモジュールのデータは原deflateストリームです。
観測:(1)一つとしてC#"デフレ"の製造方法より長い文字列が起こるだけ短い入力(2)の原deflateストリームのAdler-32チェックサム?ビットリスクのない限り交換ますので助かっています。
更新
エラーメッセージ Block length does not match with its complement
いう膨らみのあ圧縮データのC# DeflateStream
また、そのメッセージ、そこまでは、zlib、ストリームなdeflateストリームです。
見 どうを使ったDeflateStream上のファイルとは何ですか?
またコピー/ペーストのエラーメッセージを検索します数々のヒットを含むをアレンジしたモジュールでは、フロントの答えっている"と言っても同じことをしているのです。
Java Deflater
...使用する"のウェブサイト"...C#DeflateStream"は非常に簡単で、いずれに対し、Javaの実装".以下の可能Java景気指標のコンストラクタはサイトす。
public Deflater(int level, boolean nowrap)
新しいコンプレッサを作成しを、指定された圧縮レベル。ばータnowrapがtrueのZLIBヘッダおよびチェックサムの分野で使用することはありませんのために使用される圧縮形式のサポートには、GZIPおよびpkzipの両方で.
public Deflater(int level)
新しいコンプレッサを作成しを、指定された圧縮レベル。圧縮データが生成されZLIB形式です。
public Deflater()
新しいコンプレッサを作成し、デフォルトの圧縮レベル。圧縮データが生成されZLIB形式です。
ラ景気指標 後も捨てたものは2バイトzlibヘッダの4バイトのチェックサム:
uncompressed_string.encode('zlib')[2:-4] # does not work in Python 3.x
または
zlib.compress(uncompressed_string)[2:-4]
他のヒント
を使用してみましょう zlib
モジュールを膨らませ/deflateデータです。の gzip
モジュールの利用となりますので、追加のファイル-ヘッダーを作りあgzip-ファイルです。を見る gzip.py
ファイルのようなことが仕事:
import zlib
def deflate(data, compresslevel=9):
compress = zlib.compressobj(
compresslevel, # level: 0-9
zlib.DEFLATED, # method: must be DEFLATED
-zlib.MAX_WBITS, # window size in bits:
# -15..-8: negate, suppress header
# 8..15: normal
# 16..30: subtract 16, gzip header
zlib.DEF_MEM_LEVEL, # mem level: 1..8/9
0 # strategy:
# 0 = Z_DEFAULT_STRATEGY
# 1 = Z_FILTERED
# 2 = Z_HUFFMAN_ONLY
# 3 = Z_RLE
# 4 = Z_FIXED
)
deflated = compress.compress(data)
deflated += compress.flush()
return deflated
def inflate(data):
decompress = zlib.decompressobj(
-zlib.MAX_WBITS # see above
)
inflated = decompress.decompress(data)
inflated += decompress.flush()
return inflated
わからない場合に対応しうるどのようなサーバーが必要ですが、それらの機能が往データにしてみました。
パラメータのマップを直接にどのzlibに公開しています。
Python ⇒ C
zlib.compressobj(...)
⇒ deflateInit(...)
compressobj.compress(...)
⇒ deflate(...)
zlib.decompressobj(...)
⇒ inflateInit(...)
decompressobj.decompress(...)
⇒ inflate(...)
のコンストラクタの構造と移植でのデフォルト値は、通過とともに、init-。の compress
/decompress
方法を更新構造です inflate
/deflate
.