首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Haskell中解压缩zlib数据-不正确的头检查

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

Stack Overflow用户
提问于 2016-02-28 14:43:22
回答 1查看 4.2K关注 0票数 1

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

我用D写了同样的程序,效果很好。

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

FYI:你可以通过“4750304”程序进行测试。

这是我的Haskell代码

代码语言:javascript
复制
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中的工作代码

代码语言:javascript
复制
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]");
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-28 16:03:47

将ZLib导入更改为

代码语言:javascript
复制
import Codec.Compression.Zlib.Raw

甚至默认的params也在我的机器上工作:

代码语言:javascript
复制
body <- simpleHTTP (getRequest $ commentURL arg) >>= getResponseBody
let p = decompress (pack body)
Data.ByteString.Lazy.Char8.putStrLn p

给我

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?><i><chatserver>chat.bilibili.com</chatserver><chatid>4750304</chatid><mission>...

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

代码语言:javascript
复制
let Just u = parseURI $ commentURL arg
do
    body <- simpleHTTP (mkRequest GET u) >>= getResponseBody
    let p = decompress body

只使用ByteStrings。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35683896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档