파이썬에서 gzip으로 압축 된 java에서 문자열을 압축 해제하려고합니다.인코딩없이 Gzip 압축 및 압축 해제
일반적으로 파이썬에서 압축 된 문자열에 base64 인코딩을 사용하고 java에서 압축 해제를 수행하기 전에 압축 된 문자열을 디코딩합니다. base64 인코딩을 사용하는 동안이 작동합니다.
그러나 Java에서 base64 인코딩을 사용하지 않고 python으로 압축 된 gzip 문자열을 압축 해제하는 방법이 있습니다.
사실 압축 된 이진 데이터를 이진 데이터가 압축 해제 된 서버에 http 게시하려고합니다. 압축 및 http 포스트는 파이썬과 서버 측에서 java로 작성되었습니다.
파이썬에서 base64 인 코드를 사용하지 않고이 코드를 시도한 다음 버퍼 된 판독기를 사용하여 java에서 읽은 다음 압축 된 문자열을 바이트 []로 변환하여 압축 해제를 위해 GZIPInputStream에 지정된 getBytes()를 사용합니다.
java.io.IOException: Not in GZIP format at
java.util.zip.GZIPInputStream.readHeader(GZIPInputStream.java:154)
at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:75)
at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:85)
at GZipFile.gunzipIt(GZipFile.java:58)
at GZipFile.main(GZipFile.java:42)
나에게 어떤 인코딩없이 압축 및 압축 해제를 수행 할 수있는 솔루션을 제공하십시오 :하지만이 같은 예외가 발생합니다. 파이썬에서 HTTP 게시물에 바이너리 데이터를 보내는 방법이 있습니까?
import StringIO
import gzip
import base64
import os
m='hello'+'\r\n'+'world'
out = StringIO.StringIO()
with gzip.GzipFile(fileobj=out, mode="wb") as f:
f.write(m)
f=open('comp_dump','wb')
f.write(base64.b64encode(out.getvalue()))
f.close()
이 자바 감압 코드 :
이
파이썬 압축 코드//$Id$
import java.io.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import javax.xml.bind.DatatypeConverter;
import java.util.Arrays;
public class GZipFile
{
public static String readCompressedData()throws Exception
{
String compressedStr ="";
String nextLine;
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("comp_dump")));
try
{
while((nextLine=reader.readLine())!=null)
{
compressedStr += nextLine;
}
}
finally
{
reader.close();
}
return compressedStr;
}
public static void main(String[] args) throws Exception
{
GZipFile gZip = new GZipFile();
byte[] contentInBytes = DatatypeConverter.parseBase64Binary(readCompressedData());
String decomp = gZip.gunzipIt(contentInBytes);
System.out.println(decomp);
}
/**
* GunZip it
*/
public static String gunzipIt(final byte[] compressed){
byte[] buffer = new byte[1024];
StringBuilder decomp = new StringBuilder() ;
try{
GZIPInputStream gzis = new GZIPInputStream(new ByteArrayInputStream(compressed));
int len;
while ((len = gzis.read(buffer)) > 0) {
decomp.append(new String(buffer, 0, len));
}
gzis.close();
}catch(IOException ex){
ex.printStackTrace();
}
return decomp.toString();
}
}