Обработка строки / файла BZIP в Scala - PullRequest
1 голос
/ 01 марта 2011

Я немного наказываю себя, выполняя серию испытаний Python в Scala.

Теперь одна из задач - прочитать строку, сжатую с использованием алгоритма bzip, и вывести результат.

BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084

Теперь, после некоторого копания, кажется, что нет стандартной библиотеки Java для обработки bzip, но есть что-то в проекте apache ant, , которую этот парень любезно вынул для использования в качестве отдельная библиотека.

Дело в том, что я не могу заставить его работать со следующим кодом, он просто зависает в REPL Scala и JVM максимально работает при 100% загрузке ЦП

Это код, который я пытаюсь ...

import java.io.{ByteArrayInputStream}
import org.apache.tools.bzip2.{CBZip2InputStream}
import org.apache.commons.io.{IOUtils}
object ChallengeEight extends Application {
    val inputString = """BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084"""
    val inputStream = new ByteArrayInputStream( inputString.getBytes("UTF-8") ) //convert string to inputstream
    inputStream.skip(2) //skip the 'BZ' part at the start
    val bzipInputStream = new CBZip2InputStream(inputStream)  //hangs here....
    val result = IOUtils.toString(bzipInputStream, "UTF-8");
    println(result)
}

У кого-нибудь есть идеи? Или класс CBZip2InputStream ожидает дополнительные байты, которые вы можете найти в файле, заархивированном с bzip2?

Любая помощь будет оценена

РЕДАКТИРОВАТЬ Для записи это решение Python

import bz2

un = "BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!" \
     "\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084"

print [bz2.decompress(elt) for elt in (un)]

Ответы [ 2 ]

1 голос
/ 02 марта 2011

Чтобы экранировать символы, используйте escape-последовательность Unicode наподобие синтаксиса \uXXXX, где XXXX - шестнадцатеричная последовательность для символа Unicode.

val un = "BZh91AY&SYA\u00af\u0082\r\u0000\u0000\u0001\u0001\u0080\u0002\u00c0\u0002\u0000 \u0000!\u009ah3M\u0007<]\u00c9\u0014\u00e1BA\u0006\u00be\u00084"
0 голосов
/ 02 марта 2011

Вы заключаете свою строку в тройные кавычки, что означает, что вы будете передавать буквенные символы в алгоритм, а не контрольные / двоичные символы, которые они представляют.

...