如何在haskell中从二进制文件中获取char?

时间:2012-12-13 12:10:39

标签: haskell binary char

给定一个8位二进制文​​件,我想得到它的char表示。例如:

[0,1,1,0,0,0,0,1],我相信,它是'a'的二进制表示。

提前致谢!

2 个答案:

答案 0 :(得分:5)

import Data.Char

ord2chr :: [Int] -> Char
ord2chr = chr . foldl (\a b -> 2*a + b) 0

现在你可以试试

> ord2chr  [0,1,1,0,0,0,0,1]
'a'

答案 1 :(得分:4)

正如我在评论中所说,这个问题可以分为两部分。这是对第一部分的建议,我为Haskellness的缘故宣布了Bit类型:

data Bit = Zero | One

fromBits :: (Integral a) => [Bit] -> a
fromBits bits = foldl f 0 (zip [0..] (reverse bits))
    where
      f x (_, Zero) = x
      f x (n, One) = x + 2^n

这是做什么的?好吧,你的问题表明你的位列表首先是最重要的位。我们会反过来处理它,所以我们reverse bits。然后,我们需要跟踪reverse bits表示的两个元素的权力,这是zip[0..]的作用,产生[(0,最低有效位) ),(1,第二最低有效位),...]。最后foldl使用这个对列表,辅助函数f向累加器添加2的适当幂。

我使用Integral类型类不必选择整数类型。您可以在8位案例中使用Int,甚至Word8。对于较长的位列表,可以使用Integer来获得任意精度(另请参见下面的(*))。

对于第二部分,我们可以使用chrInt转换为Char,如果我们知道我们的位列表不是太大(*),{{ 1}}可以将fromIntegral类型Integral转换为a

所以,你想要的东西可以写成:

Int

在您的情况下,convert :: [Bit] -> Char convert = chr . fromIntegral . fromBits convert [Zero, One, One, Zero, Zero, Zero, Zero, One]

(*)当然,如果是的话,那么转换就不会有明显的意义。但是这里有一点我想带回家:我们将问题分成两部分,结果是第一部分(处理位列表)可以用一种更有用的方式解决设置。例如,'a'为2 ^ 100。