В вашем методе Decompress()
первые 4 байта декодированного ввода Base64 пропускаются перед передачей в GZipInputStream
. В данном конкретном случае эти байты равны 05 00 00 00
. Таким образом, в методе Compress()
эти байты должны быть возвращены непосредственно перед кодированием Base64.
Если я сделаю это, Compress () вернет следующее:
BQAAAB+LCAAAAAAAAADLSM3JyQcAhqYQNgUAAAA=
Я знаю, что это не совсем то, что вы ожидаете, а именно:
BQAAAB+LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99//P1xmZAFs9s5K2smeIYCqyB8/fnwfPyLmeVlW/w+GphA2BQAAAA==
Но, если мой результат будет снова включен в Decompress()
, я думаю, вы все равно получите "Hello"
. Попытайся. Разница может быть связана с разным уровнем сжатия, с которым вы получили исходную строку.
Так, каковы загадочные префиксные байты 05 00 00 00
? Согласно этому ответу это может быть длина сжатой строки, чтобы программа знала, какой длины должен быть распакованный байтовый буфер. Тем не менее, это не соответствует в этом случае.
Это модифицированный код для compress ():
public static String Compress(String text) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// TODO: Should be computed instead of being hard-coded
baos.write(new byte[]{0x05, 0, 0, 0}, 0, 4);
GZIPOutputStream gzos = new GZIPOutputStream(baos);
gzos.write(text.getBytes());
gzos.close();
return Base64.encode(baos.toByteArray());
}
Обновление:
Причина, по которой выходные строки в Android и ваш код .NET не совпадают, заключается в том, что реализация .NET GZip обеспечивает более быстрое сжатие (и, следовательно, больший вывод). В этом можно убедиться, взглянув на необработанные значения декодированных байтов Base64:
.NET:
1F8B 0800 0000 0000 <b>04</b>00 EDBD 0760 1C49
9625 262F 6DCA 7B7F 4AF5 4AD7 E074 A108
8060 1324 D890 4010 ECC1 88CD E692 EC1D
6947 2329 AB2A 81CA 6556 655D 6616 40CC
ED9D BCF7 DE7B EFBD F7DE 7BEF BDF7 BA3B
9D4E 27F7 DFFF 3F5C 6664 016C F6CE 4ADA
C99E 2180 AAC8 1F3F 7E7C 1F3F 22E6 7959
56FF 0F86 A610 3605 0000 00
Моя версия Android:
1F8B 0800 0000 0000 <b>00</b>00 CB48 CDC9 C907
0086 A610 3605 0000 00
Теперь, если мы проверим GZip File Format , мы увидим, что версии .NET и Android в основном идентичны в исходном заголовке и в конечных полях CRC32 и Size. Разница только в следующих полях:
- XFL = 04 (компрессор использовал самый быстрый алгоритм) в случае .NET, тогда как в Android это 00 *
- Фактические сжатые блоки
Итак, из поля XFL видно, что алгоритм сжатия .NET дает более длинный вывод.
На самом деле, когда я создаю двоичный файл с этими значениями необработанных данных, а затем распаковываю их с помощью gunzip, обе версии .NET и Android дали точно такой же вывод , что и «привет».
Так что вам не нужно беспокоиться о различных результатах.