【发布时间】:2014-04-26 13:27:09
【问题描述】:
我想在 Haskell 中编写一个结构化的二进制文件。 例如,假设前四个字节应该是“TEST”(ASCII),然后是数字 1、2、3、4,然后是 32 个字节,每个字节的值是 128,然后是 Little Endian 格式的数字 2048。
也就是说,创建的文件(十六进制)应该是这样的:
54 45 53 54 01 02 03 04 80 80 [... 30 个字节以上 ...] 00 08
所以基本上我有一个自定义数据结构,比如说
data MyData = MyData {
header :: String -- "TEST"
n1 :: Integer -- 1
n2 :: Integer -- 2
n3 :: Integer -- 3
block :: [Integer] -- 32 times 128
offset :: Integer -- 2048
}
现在我想将此数据写入文件。所以基本上我需要把这个结构转换成一个长字节串。我找不到一个干净的惯用方法来做到这一点。理想情况下我有一个功能
MyDataToByteString :: MyData -> ByteString
或
MyDataToPut :: MyData -> Put
但我不知道如何创建这样的函数。
背景信息:我想写一首脉冲追踪器格式的歌曲(http://schismtracker.org/wiki/ITTECH.TXT),这是分裂追踪器软件的二进制格式。
更新 1
对于字节序转换,我想我可以按如下方式提取单个字节:
getByte :: Int -> Int -> Int
getByte b num = shift (num .&. bitMask b) (8-8*b)
where bitMask b = sum $ map (2^) [8*b-8 .. 8*b-1]
【问题讨论】:
标签: haskell binaryfiles