2016-08-19 1 views
2

파이썬에서 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(); 
    } 

}

답변

0

아니 모든 바이트 [] 문자열로 변환 할 수 있으며 변환 백 k 은 다른 바이트를 줄 수 있습니다.

압축 할 때 인코딩을 명시 적으로 정의하고 압축을 풀 때 동일하게 지정하십시오. 그렇지 않으면 귀하의 OS, JVM 등 ... 귀하를 위해 그것을 할 것입니다. 그리고 아마 그것을 엉망으로 만들 것입니다. 예를 들어

: 내 리눅스 시스템에서 :

파이썬

import sys 
print sys.getdefaultencoding() 
>> ascii 

자바

System.out.println(Charset.defaultCharset()); 
>> UTF-8 

관련 대답 : https://stackoverflow.com/a/14467099/3014866