2012-03-19 6 views
3

Я пытаюсь декодировать строку, которую я получаю. Он сжимается с помощью дефлатера здесь: https://github.com/dankogai/js-deflate И затем base64 закодирован.Декомпрессия строки с использованием Java.util.zip.Inflater

Однако, когда я использую java inflater, я получаю следующее сообщение об ошибке: неизвестный метод сжатия.

import sun.misc.BASE64Decoder; 

    public void org() throws Exception{ 
    BASE64Decoder decoder = new BASE64Decoder(); 

    try {  

     String inputString = "84VWAVDY"; 
     byte[] decodedByteArray = decoder.decodeBuffer(inputString); 

     // Decompress the bytes 
     Inflater decompresser = new Inflater(); 
     decompresser.setInput(decodedByteArray); 
     byte[] result = new byte[100]; 

     int resultLength = decompresser.inflate(result); 
     decompresser.end(); 

     // Decode the bytes into a String 
     String outputString = new String(result, 0, resultLength); 
     System.out.println("OUTPUT:" + outputString); 

    } catch (Exception e){ 
     System.out.println("Exception: " + e); 
    } 
} 

Этот код является, в основном, копированием/вставкой из Java API. Я также попытался использовать новый Inflater (true); I.e the nowrap

«Примечание: при использовании опции« nowrap »также необходимо предоставить дополнительный« фиктивный »байт в качестве входных данных. Это требуется родной библиотеке ZLIB для поддержки определенных оптимизаций».

Итак, где же этот фиктивный байт должен быть добавлен? В начале или конце «byte [] decodedByteArray»?

Итак, любые идеи, как решить эту проблему? Нужно ли добавлять только фиктивный байт, нужно ли использовать другие методы и т. Д.?

Ну, вот и все, я думаю, вся помощь приветствуется!

Привет

Джон

ответ

4

Фиктивные байты будет добавлен в конце. Однако это необходимо только для zlib 1.1.4 и ранее. Текущие версии zlib не нужны. Я не уверен, какая версия zlib используется java.util.zip.

+0

Итак, чтобы добавить байт, мне просто нужно сделать еще один байт [], который больше, чем данные, которые я хочу добавить в 0. Затем просто скопируйте байт из исходного массива в новый, а в последней ячейке добавьте 0? – John

+0

Да. Хотя обычно исходный буфер, в который считываются данные, делается как минимум на один байт дольше, поэтому вам не нужно будет делать копию. –

+0

Ahh ok, спасибо! – John

4

Декодирование base64 «84VWAVDY» (f3 85 56 01 50 d8) не является допустимым сырым потоком дефлята и действительным обтекаемым потоком (zlib или gzip). Поэтому, несмотря ни на что, вы не получите никакого удовольствия, пытаясь раздуть эти данные.

+0

А, я думаю, это объясняет много. Большое спасибо! – John

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