8 비트 바이너리가 주어지면 그 char 표현을 얻고 싶습니다. 예를 들어,haskell에서 바이너리로부터 char을 얻는 방법은 무엇입니까?
[0110000,1] 이진수는 'a'의 이진 표현입니다.
미리 감사드립니다.
8 비트 바이너리가 주어지면 그 char 표현을 얻고 싶습니다. 예를 들어,haskell에서 바이너리로부터 char을 얻는 방법은 무엇입니까?
[0110000,1] 이진수는 'a'의 이진 표현입니다.
미리 감사드립니다.
내 의견에 제안했듯이 질문은 두 개로 나눌 수 있습니다.
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
을 사용할 수 있으며, 우리는 우리의 비트 목록 (*)가 너무 큰 아니라는 것을 알고있는 경우,
fromIntegral
는
Int
우리
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입니다.
고마워요, 효과가있었습니다! – user1898820
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) 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