2016-08-19 3 views
2

Я хочу распаковать строку в java, которая была сжата gzip в python.Gzip сжатие и декомпрессия без какой-либо кодировки

Обычно я использую кодировку base64 на сжатой строке в python, а затем декодирую эту сжатую строку перед выполнением декомпрессии в java. Это отлично работает при использовании кодировки base64.

Но есть ли способ распаковать строку в java, которая была сжата gzip в python без использования кодировки base64.

На самом деле, я хочу, чтобы http отправил сжатые двоичные данные на сервер, где двоичные данные распаковываются. Здесь сжатие и HTTP-сообщение в файле python и server - это java.

Я пробовал этот код без кодирования base64 в python и читал это в java, используя буферизованное считывающее устройство, а затем преобразовывал это чтение сжатой строки в байт [], используя getBytes(), который предоставляется GZIPInputStream для декомпрессии. Но это бросает исключение, как:

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 post в python?

Это код сжатия в Python:

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() 

Это код декомпрессии в Java:

//$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

Не каждый байт [] могут быть преобразованы в строку, а преобразование bac k может давать другие байты.

Пожалуйста, определите кодировку явно при сжатии и сделайте то же самое при распаковке. В противном случае ваши OS, JVM и т. Д. Сделают это за вас. И, вероятно, это испортит.

Например: на моей Linux машине:

Python

import sys 
print sys.getdefaultencoding() 
>> ascii 

Java

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

Связанные ответ: https://stackoverflow.com/a/14467099/3014866

Смежные вопросы