如何从haskell中的文件中读取二进制数据数组?
尝试读取Word8的二进制文件时,我有以下程序:如何从haskell中的文件中读取二进制数据数组?,haskell,Haskell,尝试读取Word8的二进制文件时,我有以下程序: import qualified Data.Binary as B type Chars = [B.Word8] printChars :: Chars -> IO() printChars cs = mapM_ print cs main :: IO() main = do chars <- B.decodeFile "chars" printChars chars 似乎decodeFile需要一个无限的列表。 我怎么
import qualified Data.Binary as B
type Chars = [B.Word8]
printChars :: Chars -> IO()
printChars cs = mapM_ print cs
main :: IO()
main = do
chars <- B.decodeFile "chars"
printChars chars
似乎decodeFile需要一个无限的列表。
我怎么能告诉它只读取尽可能多的元素
编辑:
这是我正在寻找的代码:它适用于任何类型,而不仅仅是Word8
import Prelude hiding ( readFile )
import Data.ByteString.Lazy ( readFile )
import Data.Binary.Get ( isEmpty, runGet )
import qualified Data.Binary as B
type Chars = [B.Word8]
printChars :: Chars -> IO()
printChars cs = mapM_ print cs
-- see http://hackage.haskell.org/package/binary-0.7.1.0/docs/Data-Binary-Get.html
-- function getTrades
getChars = do
e <- isEmpty
if e then return []
else do
c <- B.get
cs <- getChars
return (c:cs)
main :: IO()
main = do
input <- readFile "chars"
printChars $ runGet getChars input
Binary用于以二进制类实例定义的规范方式序列化已知类型。一般来说,它不适用于非结构化数据
在您提供给我们的示例中,您正在尝试将文件中的字节反序列化为[B.Word8]类型的对象。如果您查看Data.Binary源代码,您可以看到以下内容
instance Binary a => Binary [a] where
get = do n <- get :: Get Int
getMany n
因此,当您将该值应用于文件时,它无疑会读取文件中的第一个Int,一个非常大的数字,然后尝试读取该数量的值
如果只想以字节形式加载文件,则应使用Data.ByteString.getContentsData.Binary用于以二进制类实例定义的规范方式序列化已知类型。一般来说,它不适用于非结构化数据
在您提供给我们的示例中,您正在尝试将文件中的字节反序列化为[B.Word8]类型的对象。如果您查看Data.Binary源代码,您可以看到以下内容
instance Binary a => Binary [a] where
get = do n <- get :: Get Int
getMany n
因此,当您将该值应用于文件时,它无疑会读取文件中的第一个Int,一个非常大的数字,然后尝试读取该数量的值
如果只想以字节形式加载文件,则应使用Data.ByteString.getContents
[length of array, val1, val2, ....]