给定一个8位二进制文件,我想得到它的char表示。例如:
[0,1,1,0,0,0,0,1],我相信,它是'a'的二进制表示。
提前致谢!
答案 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
来获得任意精度(另请参见下面的(*))。
对于第二部分,我们可以使用chr
将Int
转换为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。