我試圖解析使用Haskell的二進制格式(PES):如何讀取haskell字符串中的24位整數?
import qualified Data.ByteString.Lazy as BL
import Data.Word
import Data.Word.Word24
import qualified Data.ByteString.Lazy.Char8 as L8
data Stitch = MyCoord Int Int deriving (Eq, Show)
data PESFile = PESFile {
pecstart :: Word24
, width :: Int
, height :: Int
, numColors :: Int
, header :: String
, stitches :: [Stitch]
} deriving (Eq, Show)
readPES :: BL.ByteString -> Maybe PESFile
readPES bs =
let s = L8.drop 7 bs
pecstart = L8.readInt s in
case pecstart of
Nothing -> Nothing
Just (offset,rest) -> Just (PESFile offset 1 1 1 "#PES" [])
main = do
input <- BL.getContents
print $ readPES input
我需要閱讀pecstart其他數據(寬度,高度和拆線) 的得到補償但這不是爲我工作,因爲我需要讀取24位值,並且ByteString包似乎沒有24位版本。
我應該使用不同的方法嗎? Data.Binary包對於簡單的格式似乎很好,但我不確定它是如何工作的,因爲你必須讀取一個值才能找到文件中其他數據的偏移量。我失蹤的東西?
難道你不只是添加'Binary'爲'PESFile'的實例?二進制包看起來很好,因爲put/get函數是一系列操作(例如,您可以閱讀pecstart以獲得下一位)。 – 2011-06-04 20:09:03
我很想嘗試這種方法傑夫。我一直在關於二進制輸入的Real World Haskell章節中工作。如果有關於創建新Binary實例的教程,我很樂意嘗試一下。 – nont 2011-06-04 20:14:44
出於效率的原因,您應該將標題保留爲字符串。而'MyCoord'應該使用嚴格的'Int'字段(例如'!Int')。 – 2011-06-04 20:26:21