我需要将文件读取为字节,而不是字符。 但是当我执行getLine或getContents时,我得到IO String,并且需要[Int],而不是String。 我该怎么办?
答案 0 :(得分:8)
Data.ByteString内部代表严格的 Word8 数组。
你几乎就像你已经习惯的那样使用它。导入它合格,例如
import qualified Data.ByteString as B
然后做像
这样的事情main = do
str <- B.getLine
let bytes = B.unpack str
print bytes
我不确定你怎么相信你需要Int。你想要一个正确的字节表示,例如Word8
答案 1 :(得分:4)
您可能会要求某种形式的反序列化,这应该被视为一个单独的步骤。首先考虑您正在读取某种二进制文件(即它不是文本)。为此,我们可能需要bytestring
并且可以执行:
import qualified Data.ByteString.Lazy as BL
...
contents <- BL.readFile someFile
获取文件内容后,我们可以从任何形式(String
,Text
,ByteString
等)转换它们。你说你想要[Int]
但是这并不能告诉我们数据的形式 - 这些是32位整数的大端吗? 64位?有多少人,你知道吗?让我们假设32位大端整数...并且假设文件完全由这些值组成:
import qualified Data.ByteString.Lazy as BL
import Data.Binary.Get
import Control.Monad
import Foreign.Storable
import Data.Word
readAndDecode :: FilePath -> IO [Int]
readAndDecode someFile =
do contents <- BL.readFile someFile
let nrWord32 = fromIntegral (BL.length contents) `div` sizeOf (undefined :: Word32)
return $ runGet (map fromIntegral `fmap` replicateM nrWord32 getWord32be) contents
也就是说,我们读取文件,计算文件中32位字的数量,解码并将每个Word32
转换为Int