我写了一个简单的Haskell程序,从某个网站获取一些压缩数据,然后解压缩它,但我总是收到一个错误,说"不正确的标题检查"。
我在 D lang 中编写了相同的程序,它工作正常。
现在,我可以在 Haskell 中获取原始压缩数据,唯一的问题似乎是 DecompressParams 中的窗口位和缓冲区大小。(Haskell中的解压缩参数不接受负值)
仅供参考:您可以将"4750304"传递给程序进行测试。
这是我的哈斯克尔代码
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 lang 中的工作代码
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]");
}
}
将 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>...
注意:你可以避免打包字符串,将网络 uri 添加到你的 cabal 文件中,添加import Network.URI (parseURI)
导入和
let Just u = parseURI $ commentURL arg
do
body <- simpleHTTP (mkRequest GET u) >>= getResponseBody
let p = decompress body
仅使用字节字符串。