31 lines
807 B
Haskell
31 lines
807 B
Haskell
|
|
module Encoding.Base2
|
||
|
|
( enc2
|
||
|
|
, dec2
|
||
|
|
) where
|
||
|
|
|
||
|
|
import Data.Char (ord, chr, digitToInt, intToDigit)
|
||
|
|
|
||
|
|
binaryToChar :: String -> Char
|
||
|
|
binaryToChar binStr = chr $ binaryToInt binStr
|
||
|
|
|
||
|
|
binaryToInt :: String -> Int
|
||
|
|
binaryToInt binStr = Prelude.foldl (\acc x -> acc * 2 + digitToInt x) 0 binStr
|
||
|
|
|
||
|
|
dec2 :: String -> String
|
||
|
|
dec2 input = map binaryToChar $ words input
|
||
|
|
|
||
|
|
|
||
|
|
charToBinary :: Char -> String
|
||
|
|
charToBinary char = let binaryStr = intToBinary $ ord char
|
||
|
|
in replicate (7 - Prelude.length binaryStr) '0' ++ binaryStr
|
||
|
|
|
||
|
|
intToBinary :: Int -> String
|
||
|
|
intToBinary n = reverse $ decimalToBinary' n
|
||
|
|
where
|
||
|
|
decimalToBinary' 0 = "0"
|
||
|
|
decimalToBinary' m = let (q, r) = m `divMod` 2 in intToDigit r : decimalToBinary' q
|
||
|
|
|
||
|
|
enc2 :: String -> String
|
||
|
|
enc2 input = unwords $ map charToBinary input
|
||
|
|
|