Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从haskell中的文件中读取二进制数据数组?_Haskell - Fatal编程技术网

如何从haskell中的文件中读取二进制数据数组?

如何从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需要一个无限的列表。 我怎么

尝试读取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需要一个无限的列表。 我怎么能告诉它只读取尽可能多的元素

编辑:

这是我正在寻找的代码:它适用于任何类型,而不仅仅是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.getContents

Data.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, ....]