2011-03-01 15 views
1

我在Scala中通過執行python挑戰系列來懲罰自己。在Scala中處理BZIP字符串/文件

現在,挑戰之一是讀入一個已經使用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項目,that this guy欣然取出用作單獨的庫。

的事情是,我似乎無法得到它與下面的代碼的工作,它只是掛在斯卡拉REPL和JVM在100%的CPU使用率

馬克塞斯這是我的代碼m試圖...

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)] 
+0

我的標準行爲在這樣的情況下:按Ctrl + F8,按住Shift + F9,F7,F7,F7,F7 ....下降到奇異點:) – tenshi 2011-03-01 20:16:22

回答

1

要轉義字符使用unicode escape sequence類似\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

這似乎得到比以前更多(它不掛),但我運行代碼時得到一個'java.lang.ArrayIndexOutOfBoundsException:18002'。有任何想法嗎? – djhworld 2011-03-02 09:11:03

+1

它適用於您爲ISO-8859-1交換第一個UTF-8轉換;像這樣:「val inputStream = new ByteArrayInputStream(inputString.getBytes(」ISO-8859-1「))」。然而,我相信這更是偶然。在JVM中字符串是字符串,二進制文件是字節數組。嘗試將二進制數據保存爲字符串時有很多陷阱。 – thoredge 2011-03-02 10:25:14

+0

哦,上帝啊,謝謝你,這工作很好!我明白,這並不是解決問題的最好方式,但我一直在努力解決這個愚蠢的挑戰。 – djhworld 2011-03-02 11:32:39

0

你包圍你在三引號字符串,這意味着你將文字字符傳遞給算法而不是他們所代表的控制/二進制字符。

+0

把單引號括起來的只是拋出的負載嘗試編譯時出現'error:invalid escape character'錯誤! – djhworld 2011-03-01 22:08:53