2016-02-28 60 views
1

我編寫了一個簡單的Haskell程序,它從某個網站獲取一些壓縮數據然後解壓縮,但我總是得到一個錯誤,說'不正確的頭文件檢查'。解壓縮Haskell中的zlib數據 - 錯誤的標題檢查

我已經在D lang中編寫了相同的程序,它工作正常。

現在,我可以在Haskell中獲取原始壓縮數據,唯一的問題似乎是DecompressParams中的窗口位和緩衝區大小。 (Haskell中的DecompressParam不接受負值)

僅供參考:您可以將'4750304'傳遞給程序進行測試。

這裏是我的Haskell代碼

module Main where 

import Codec.Compression.Zlib 
import Network.HTTP 
import System.Environment (getArgs) 
import Data.ByteString.Lazy.Char8 

commentURL :: [Char] -> [Char] 
commentURL cid = do 
    "http://comment.bilibili.com/" ++ cid ++ ".xml" 

main :: IO() 
main = do 
    (arg:_) <- getArgs 
    do 
     body <- simpleHTTP (getRequest $ commentURL arg) >>= getResponseBody 
     let params = DecompressParams { 
         decompressWindowBits = WindowBits 15, 
         decompressBufferSize = 0, 
         decompressDictionary = Nothing 
        } 
     let p = decompressWith params (pack body) 
     Data.ByteString.Lazy.Char8.putStrLn p 

而在d郎

import std.stdio; 
import std.net.curl; 
import std.array; 
import std.string; 
import std.zlib; 

void main(string[] args) { 
    if (args[1].length <= 14 && args[1].isNumeric) { 
     auto url = appender!string; 
     url.put("comment.bilibili.com/"); 
     url.put(args[1]); 
     url.put(".xml"); 

     auto deflate = get(url.data); 
     auto data = cast(char[])uncompress(deflate, 0, -15); 
     // DecompressParam in Haskell doesn't accept negative value 

     File file = File(args[1]~".xml", "wb"); 
     file.write(data); 
     file.close(); 
    } else { 
     writeln("Usage: "~args[0]~" [cid]"); 
    } 
} 
+1

btw。你可以'將Data.ByteString.Lazy.Char8導入爲BS',這樣你就可以在後面編寫'BS.putStrLn'這個更具可讀性了。 – epsilonhalbe

回答

2
工作代碼

您的ZLib進口改爲

import Codec.Compression.Zlib.Raw 

而且就連默認PARAMS工作我機器:

body <- simpleHTTP (getRequest $ commentURL arg) >>= getResponseBody 
let p = decompress (pack body) 
Data.ByteString.Lazy.Char8.putStrLn p 

給我

<?xml version="1.0" encoding="UTF-8"?><i><chatserver>chat.bilibili.com</chatserver><chatid>4750304</chatid><mission>... 

注意:你能避免包裝的字符串,添加網絡-URI您小集團文件,添加import Network.URI (parseURI)進口和

let Just u = parseURI $ commentURL arg 
do 
    body <- simpleHTTP (mkRequest GET u) >>= getResponseBody 
    let p = decompress body 

要使用字節串才起作用。

+0

謝謝,它現在完全適合我! – 0xBBC

+0

更改導入導致默認參數正常工作的任何原因? – Sibi