在Haskell中解压缩zlib数据 - 不正确的标头检查

时间:2016-02-28 14:43:22

标签: haskell haskell-zlib

我编写了一个简单的Haskell程序,它从某个网站获取一些压缩数据,然后解压缩,但我总是得到一个错误,说'不正确的标题检查'。

我在D lang写了相同的程序,它工作正常。

现在,我可以在Haskell中获取原始压缩数据,唯一的问题似乎是DecompressParams中的窗口位和缓冲区大小。 (Haskell中的DecompressParam不接受负值)

仅供参考:你可以将'4750304'传递给程序进行测试。

这是我的Haskell代码

1. ERROR at solution.java (at line 12)
Queue<T> bufferQueue = new Queue<T>();
                           ^^^^^
Cannot instantiate the type Queue<T>

D lang中的工作代码

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

1 个答案:

答案 0 :(得分:2)

将ZLib导入更改为

import Codec.Compression.Zlib.Raw

即使是我的机器上的默认参数:

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>...

注意:您可以避免打包字符串,将network-uri添加到您的cabal文件中,添加import Network.URI (parseURI)导入和

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

仅适用于ByteStrings。