Domanda

sto porting di un'applicazione Python per Android e, ad un certo punto, questa applicazione ha per comunicare con un servizio Web, l'invio di dati compressi.

Per fare che usa il metodo successivo:

def stuff(self, data):
    "Convert into UTF-8 and compress."
    return zlib.compress(simplejson.dumps(data))

Sto usando il metodo successivo per cercare di emulare questo comportamento in Android:

private String compressString(String stringToCompress)
{
    Log.i(TAG, "Compressing String " + stringToCompress);
    byte[] input = stringToCompress.getBytes(); 
    // Create the compressor with highest level of compression 
    Deflater compressor = new Deflater(); 
    //compressor.setLevel(Deflater.BEST_COMPRESSION); 
    // Give the compressor the data to compress 
    compressor.setInput(input); 
    compressor.finish(); 
    // Create an expandable byte array to hold the compressed data. 
    // You cannot use an array that's the same size as the orginal because 
    // there is no guarantee that the compressed data will be smaller than 
    // the uncompressed data. 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(input.length); 
    // Compress the data 
    byte[] buf = new byte[1024]; 
    while (!compressor.finished()) 
    { 
        int count = compressor.deflate(buf); 
        bos.write(buf, 0, count); 
    } 

    try { 
        bos.close(); 
    } catch (IOException e) 
    { 

    } 
    // Get the compressed data 
    byte[] compressedData = bos.toByteArray(); 

    Log.i(TAG, "Finished to compress string " + stringToCompress);

    return new String(compressedData);
}

Ma la risposta HTTP dal server non è corretto e credo che sia perché il risultato della compressione in Java non è la stessa di quella in Python.

ho fatto un piccolo test di compressione "a" sia con zlib.compress e sgonfiare.

Python, zlib.compress () -> x% 9CSJT% 02% 00% 01M% 00% A6

Android, Deflater.deflate -> H% EF% BF% BDK% 04% 00% 00b% 00b

Come faccio a comprimere i dati in Android per ottenere lo stesso valore di zlib.compress () in Python?

Qualsiasi aiuto, la guida o il puntatore è molto apprezzato!

È stato utile?

Soluzione 2

Anche se non sono esattamente gli stessi algoritmi, sembra che essi sono totalmente compatibili (il che significa che se si comprime, per esempio, una stringa utilizzando Deflater.deflate è possibile decomprimere correttamente utilizzando zlib).

Che cosa ha causato il mio problema era che tutte le variabili di modulo in un post devono essere sfuggito per cento, e l'applicazione Android non stava facendo questo. Codifica i dati in Base64 prima di inviarlo, e modificando il server per decodificarlo utilizzando Base64 prima di decompressione usando zlib risolto il problema.

Altri suggerimenti

comprimere e sgonfiare sono diversi algoritmi di compressione per cui la risposta è che non saranno compatibili. Come esempio della differenza qui è 'un' compresso utilizzando due algoritmi tramite Tcl:

% binary encode hex [zlib compress a]
789c4b040000620062
% binary encode hex [zlib deflate a]
4b0400

Il codice Python è infatti facendo impacco. E il codice di Android sta facendo sgonfiare, ma si sta anche ottenendo il marchio UTF-8 byte order anteporre alla versione di Android (\ XEF \ XBF \ XBF)

È possibile emettere i dati deflate utilizzando python:

def deflate(data):
    zobj = zlib.compressobj(6,zlib.DEFLATED,-zlib.MAX_WBITS,zlib.DEF_MEM_LEVEL,0)
    zdata = zobj.compress(data)
    zdata += zobj.flush()
    return zdata
>>> deflate("a")
'K\x04\x00'

Lo byte[] input = stringToCompress.getBytes("utf-8"); aiutare? Nel caso in cui la codifica di default della vostra piattaforma non è UTF-8, questo costringerà la stringa di codifica -> byte di utilizzare UTF-8. Inoltre, lo stesso vale per l'ultima riga di codice in cui si crea una new String -. Si consiglia di specificare esplicitamente UTF-8 come la decodifica Carattere

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top