В моем приложении для Android он загружает огромную строку с php. Я хочу сжать его, чтобы сохранить пропускную способность. Я нашел эту страницу http://php.net/manual/en/function.gzcompress.php что позволяет мне сжать его в php. Но как только я получу его в Android, как мне вернуть исходную строку?
Спасибо
В моем случае мне нужно было распаковать строку в PHP, которая была сжата в Android и наоборот, и эти строки транспортировались RabbitMQ.
Вот как я это решил:
В Android:
public static byte[] compress(String string) throws IOException {
// string = "Lorem ipsum shizzle ma nizle";
byte[] data = string.getBytes("UTF-8");
ByteArrayOutputStream os = new ByteArrayOutputStream( data.length );
GZIPOutputStream gos = new GZIPOutputStream(os);
gos.write( data );
gos.close();
os.close();
return os.toByteArray();
}
public static String decompress(byte[] compressed) throws IOException {
final int BUFFER_SIZE = compressed.length;
ByteArrayInputStream is = new ByteArrayInputStream(compressed);
GZIPInputStream gis = new GZIPInputStream(is, BUFFER_SIZE);
StringBuilder string = new StringBuilder();
byte[] data = new byte[BUFFER_SIZE];
int bytesRead;
while ((bytesRead = gis.read(data)) != -1) {
string.append(new String(data, 0, bytesRead));
}
gis.close();
is.close();
return string.toString();
}
RabbitMQ Звонки с Android:
.
.
// Publish
chan.basicPublish(EXCHANGE, routing_key, MessageProperties.PERSISTENT_BASIC, compress(message.payload));
.
.
// Subscribe
String message = decompress(body);
.
.
.
От RabbitMQ Плагин управления Я получил версию строки в кодировке Base64 на латинице и запустил ее для этого тестового приложения. в PHP чтобы увидеть, какая методология декомпрессии работает.
<?php
$data = "Lorem ipsum shizzle ma nizle";
// try all the compression algorithms and out the results in Hex format
echo "\n\n\n";
for($i=-1;$i<=9;$i++)
echo chunk_split(strtoupper(bin2hex(gzcompress($data,$i))),2," ") . PHP_EOL ;
echo "\n\n";
for($i=-1;$i<=9;$i++)
echo chunk_split(strtoupper(bin2hex(gzdeflate($data,$i))),2," ") . PHP_EOL ;
echo "\n\n";
for($i=-1;$i<=9;$i++)
echo chunk_split(strtoupper(bin2hex(gzencode($data,$i,FORCE_GZIP))),2," ") . PHP_EOL;
echo "\n\n";
for($i=-1;$i<=9;$i++)
echo chunk_split(strtoupper(bin2hex(gzencode($data,$i,FORCE_DEFLATE))),2," ") . PHP_EOL;
echo "\n\n";// add the Base64 encoded text from the RabbitMQ plugin
$data = "H4sIAAAAAAAAAPPJL0rNVcgsKC7NVSjOyKyqyklVyE1UyMsEMgCX3v4lHAAAAA==";
$data = base64_decode($data);
// output the binary version of the compressed string in Hex format
echo chunk_split(strtoupper(bin2hex($data)),2," ") . PHP_EOL ;
// match the HEX string to the samples from above as there may be an offset that you need to deal with
// finally see which of the decompression methods work
echo gzuncompress($data)."\n";
echo gzinflate($data)."\n";
echo gzdecode($data)."\n";
// Double check that you have the correct one
$data = "Lorem ipsum shizzle ma nizle";
echo chunk_split(strtoupper(bin2hex(gzencode($data,9,FORCE_GZIP))),2," ") . PHP_EOL;
$data = gzencode($data,9,FORCE_GZIP);
echo gzdecode($data)."\n";
Спасибо
Похоже, что он просто использует сжатие GZIP. Если это так, взгляните на:
http://developer.android.com/reference/java/util/zip/GZIPInputStream.html
Если это не совсем используемый алгоритм сжатия, есть еще несколько встроенных алгоритмов, которые вы можете использовать по мере необходимости:
http://developer.android.com/reference/java/util/zip/package-summary.html