2016-02-28 55 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