2012-12-13 2 views
2

8 비트 바이너리가 주어지면 그 char 표현을 얻고 싶습니다. 예를 들어,haskell에서 바이너리로부터 char을 얻는 방법은 무엇입니까?

[0110000,1] 이진수는 'a'의 이진 표현입니다.

미리 감사드립니다.

+1

을 시도 할 수 있습니다. 1) 2 진수의리스트를 'Int'로 변환하십시오. 2) 'Int'를 'Char'로 변환. Hoogle은 ['chr']을 사용할 수 있다고 (http://www.haskell.org/hoogle/?hoogle=Int%20-%3E%20Char) (http://hackage.haskell.org/ packages/archive/base/latest/doc/html/Data-Char.html # v : chr)를 사용하십시오. – gspr

답변

4

내 의견에 제안했듯이 질문은 두 개로 나눌 수 있습니다.

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 

그래서이 어떤 역할을합니까 : 나는 Haskellness '술에 대한 Bit 유형을 선언 한 곳 여기서, 첫 번째 부분에 대한 제안입니까? 글쎄, 귀하의 질문에 귀하의 비트 목록이 가장 중요한 비트가 먼저 제안합니다. 역순으로 처리하므로 reverse bits을 처리합니다. 그리고 에있는 여러 요소의 힘을 추적 할 필요가 있는데, 이는 [0..]으로 zip을 입력하면 [(0, 최하위 비트), (1, 두 번째 최소 중요 비트) , ...]. 마지막으로 foldl은이 쌍의 목록을 사용하고 보조자 함수 f은 누산기에 2의 적절한 제곱을 더합니다.

Integral typeclass를 사용하여 정수형을 선택할 필요가 없습니다. 8 비트의 경우 Int 또는 심지어 Word8을 사용할 수 있습니다. 더 긴 비트 목록의 경우 임의의 정밀도로 Integer을 사용할 수 있습니다 (아래 (*) 참조).

두 번째의 경우, 우리는 Int Char에 변환 할 chr을 사용할 수 있으며, 우리는 우리의 비트 목록 (*)가 너무 큰 아니라는 것을 알고있는 경우, fromIntegralInt 우리 Integral 유형 a을 변환 할 수 있습니다. convert [Zero, One, One, Zero, Zero, Zero, Zero, One]'a'입니다, 귀하의 경우에는

convert :: [Bit] -> Char 
convert = chr . fromIntegral . fromBits 

:

그럼, 당신이 원하는 것은 같이 쓸 수있다.

(*) 물론 그렇다고하더라도 변환은 분명히 분명하지 않습니다. 그러나 여기에 내가 갖고 싶어하는 점이있다. 우리는 두 부분으로 문제를 나누었고, 첫 번째 부분 (비트 목록을 처리하는 것)은 좀 더 일반적으로 유용 할 수있는 방법으로 해결 될 수있다. 환경. 예를 들어 fromBits (One:(replicate 100 Zero))은 2^100입니다.

+0

고마워요, 효과가있었습니다! – user1898820

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' 
관련 문제