字符串二进制编解码

字符串二进制编码

编码

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

posted @ 2025-05-19 22:31  (.)$(.)  阅读(2)  评论(0)    收藏  举报