字符串二进制编解码
字符串二进制编码
编码
bit2int
int2bit
make8 八位数
parity 奇偶校验
encode String 编码
graph LR
A(c) --> B[[ord]] --> C[[8 bit]] --> D[[奇偶校验]] --> E(9 bit)
解码
chop9
check 校验奇偶位并去掉
decode bitsToString
graph LR
A(9 bit) --> B[[check]] --> C[[校验奇偶位]] --> D(8 bit) --> E[[bin2int]] --> F[[chr]] --> G(c)
验证
> transmit "higher-order functions are easy"
"higher-order functions are easy"
代码
import Data.Char
type Bit = Int
-- 编码
bin2int :: [Bit] -> Int
bin2int = foldr (\x y -> x + 2*y) 0
int2bit :: Int -> [Bit]
int2bit n = n `mod` 2 : int2bit (n `div` 2)
make8 :: [Bit] -> [Bit]
make8 bs = take 8 (bs ++ repeat 0)
parity :: [Bit] -> [Bit]
parity bs = sum bs `mod` 2 : bs
encode :: String -> [Bit]
encode = concatMap (parity . make8 . int2bit . ord)
-- 解码
chop9 :: [Bit] -> [[Bit]]
chop9 [] = []
chop9 bss = take 9 bss : chop9 (drop 9 bss)
check :: [[Bit]] -> [[Bit]]
check [] = []
check (bs:bss) | head bs /= sum (tail bs) `mod` 2 = error "parity check"
| otherwise = tail bs : check bss
decode :: [Bit] -> String
decode = map (chr . bin2int) . check . chop9
-- 信道
transmit :: String -> String
transmit = decode . channel . encode
channel = id
参考: Programming in Haskell ch7.6