2016-10-25 26 views
0

Androidアプリ(Java)で文字列を圧縮し、Pythonでサーバー上で解凍しようとしています。 Inflaterクラスを使用しようとしましたが、python側で「エラー:データの圧縮解除中にエラー-3:ヘッダチェックが正しくありません」というメッセージが表示されます。私はアプリがあることpythonで文字列を解凍するにはどうすればよいJavaで圧縮し、Pythonで解凍しますか?

String stringData = commentData == null ? sleepData.toString() : sleepData.toString() + commentData.toString(); 

byte[] bytes = stringData.getBytes("UTF-8"); 
int length = bytes.length; 
Deflater deflater = new Deflater(); 
deflater.setInput(bytes); 
deflater.finish(); 
byte[] compressedBytes = new byte[length]; 
deflater.deflate(compressedBytes); 
deflater.end(); 

を:、私たちは圧縮するのDeflaterを使用しているAndroidの側で

data_string = zlib.decompress(compressed_string) 

:pythonの側では、私は解凍したzlibを使用しています送信していますか?

ありがとうございます!

EDITS: これはAndroidから送信され、解凍コマンドに入力されているものです(ドットはちょうど同じものを示しています。最後に0が多く、最後に0bがあります) 78efbfbdefbfbdefbfbdefbfbd6e1b2 .... efbfbd190000000 ..... 0000 000000000b0b0b0b0b0b我々がしようとしている物事0b0b0b0b0b

- 新しいエラーを与えるdata_string = zlib.decompress(復号化され、-zlib.MAX_WBITS)、 : "データを解凍中にエラー-3:格納されたブロック長が無効です"

- data_最初のエラー "無効なヘッダーのチェック"を与えるstring = zlib.decompressobj(復号化された、15 + 32)とdata_string = zlib.decompress(compressed_string、16 + zlib.MAX_WBITS)。

+0

どのようにサーバー/ Pythonの側へのAndroid/Java側からデータを送信していますか? –

+1

関連:http://stackoverflow.com/questions/2424945/are-zlib-compress-on-python-and-deflater-deflate-on-java-android-compatible –

+0

デフォルトでは 'Deflater'が生成するので動作します。 zlibフォーマット、 'zlib.decompress()'はデフォルトでzlibフォーマットが必要です。 'zlib.decompress()'に何を供給しているのかの最初の数バイトを16進数で入力できますか? –

答えて

0

解凍で二[オプション] wbits引数として16+zlib.MAX_WBITSまたは15 + 32を追加します:EDIT https://docs.python.org/2/library/zlib.html#zlib.decompress

data_string = zlib.decompress(compressed_string, 16+zlib.MAX_WBITS)

: あなたは、Pythonに圧縮されたバイトを渡している方法に応じて、それは可能性がありますあなたの問題がありますPythonがあなたの圧縮されたバイトをどのように読み込んでいるかを調べます

私は、この静脈にそれらのバイトを解凍後、PythonでBASE64のデコード、Javaで圧縮されたバイトにBase64エンコードを使用することをお勧めします...

のJava:

String inputString = "blahblahblah"; 
byte[] input = inputString.getBytes("UTF-8"); 

// Compress the bytes 
byte[] output = new byte[100]; 
Deflater compresser = new Deflater(); 
compresser.setInput(input); 
compresser.finish(); 
int compressedDataLength = compresser.deflate(output); 
compresser.end(); 
System.out.println(Base64.getEncoder().encodeToString(output)); 

のPython:

import base64 
import zlib 
base64_binary = b"eJxLyknMSIJiAB8CBMYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" 
deflate_bytes=base64.decodebytes(base64_binary) 
zlib.decompress(deflate_bytes) 
# b'blahblahblah' 

関連:

How can I decompress a gzip stream with zlib?

Python decompressing gzip chunk-by-chunk

Byte Array in Python

+0

回答をありがとうございます!オプションパラメータとして16 + zlib.MAX_WBITSまたは15 + 32を追加しても機能しませんでした同じエラーが発生しました – Maria

+0

ところで、私たちも "data_string = zlib.decompress(decrypted 、-zlib.MAX_WBITS) "というエラーが表示され、「データの解凍中にエラー-3が発生しました:格納されたブロックの長さが無効です」 – Maria

+0

@Maria http://stackoverflow.com/questions/3122145/zlib-error-error-3-while -decompr essing-incorrect-header-check これらの例のいずれかが動作しますか?私は上記のあなたの無効な格納されたブロックの長さのエラーを与えていないと思う。あなたは正確に何をしようとしているのかのサンプルを提供できますか? – Garren

関連する問題