我編寫了一個簡單的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]");
}
}
btw。你可以'將Data.ByteString.Lazy.Char8導入爲BS',這樣你就可以在後面編寫'BS.putStrLn'這個更具可讀性了。 – epsilonhalbe