2011-04-03 77 views
0

我試圖用Haskell的Data.Binary.Get解析一個Gzip文件的頭。標頭的結構如下:Haskell:解析二進制流,然後計算它的CRC

    含ID,旗,他人
  • 固定字段
  • 如果數據的標誌& 0×01,則可選的16位字(長)+長度字節
  • 如果flag & 0×02,則空結尾的字符串
  • 如果標誌& 0×04,則空結尾的字符串
  • ...
  • 以上
  • CRC

要報告錯誤(例如, Gzip已意想不到的領域),我使用的解析器如下:

Data GzipError = GE1 | GE2 | ... 
instance Error GzipError where ... 
parseHeader :: ErrorT GzipError Get GzipHeader 

這裏是我的問題:我如何解析的頭都固定&變量字段,但在同一時間得到字節串的字段被解析,以便我可以計算和驗證CRC?

我注意到我需要返回錯誤,因爲我想過使用lookAhead,但它有一個Get a -> Get a類型,這意味着我不能在內部執行錯誤處理,這是我需要做的。

這幾乎就像我需要爲獲取monad設置書籤,讀取字段,然後要求獲取ByteString從書籤到當前位置。當然,它不提供這種功能。

任何想法?

回答

2

使用runGetState,它返回消耗的字節數。然後你可以從原始的ByteString和校驗和中刪除那麼多字節。