1

我通过在 Scala 中进行 python 挑战系列来惩罚自己。

现在,挑战之一是读取使用 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该类是否期望您可能在已压缩的文件中找到一些额外的字节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 字符的十六进制序列。

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 回答