1

私はScalaでPythonチャレンジシリーズを行うことで少し自分を罰しています。

ここでの課題の1つは、bzipアルゴリズムを使用して圧縮された文字列を読み取り、結果を出力することです。

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

少し掘り下げてみると、bzip処理用の標準のJavaライブラリがないように見えますが、apache antプロジェクトには、この男が別のライブラリとして使用するために親切に取り出したものがあります。

問題は、次のコードで動作させることができないようです。それはscala REPLでハングし、JVMは100%のCPU使用率で最大になります。

これは私が試しているコードです...

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クラスは、zip形式で圧縮されたファイルに含まれる可能性のある余分なバイトを予期しています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)]
4

2 に答える 2

1

文字をエスケープするには、構文のようなUnicodeエスケープシーケンス\uXXXXを使用します。ここで、XXXXはUnicode文字の16進シーケンスです。

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"
于 2011-03-02T04:41:05.533 に答える
0

文字列を三重引用符で囲んでいます。つまり、文字列が表す制御/バイナリ文字ではなく、リテラル文字をアルゴリズムに渡します。

于 2011-03-01T22:04:06.443 に答える