模擬場景:
實(shí)現(xiàn)一種錯誤檢測機(jī)制,它使用了標(biāo)準(zhǔn)CRC算法。請編寫兩個程序:生成器generator和驗(yàn)證器verifier傲茄。生成器程序從標(biāo)準(zhǔn)輸入讀入一個n位的報文,該報文是由0和1組成的ASCII文本字符竄沮榜,它是第一行盘榨。第二行是k位的多項(xiàng)式,也是ASCII文本蟆融。該程序輸出一行ASCII文本(到標(biāo)準(zhǔn)輸出)草巡,其中包含n+k個0和1,代表了要被傳輸?shù)膱笪男退帧H缓笊胶草敵龆囗?xiàng)式,就好像它讀入進(jìn)來時一樣弥喉。驗(yàn)證器程序?qū)⑸善鞒绦虻妮敵鲎x入進(jìn)來郁竟,并輸出一條報文,說明它是正確的還是錯誤的由境。最后棚亩,再編寫一個程序alter,根據(jù)它的參數(shù)(位的順序號虏杰,計算的時候從左向右進(jìn)行讥蟆,并且從1開始計數(shù))變反第一行中由參數(shù)指定的位,兩行字符串中其他的內(nèi)容完全一致地復(fù)制過來嘹屯。通過輸入:
generator <file | verifier
你應(yīng)該看到該報文是正確的攻询,但是,當(dāng)你輸入:
generator <file | alter arg | verifier
你應(yīng)該得到錯誤的提示信息州弟。
簡單代碼實(shí)現(xiàn):
#generator.sh
#!/bin/bash
read message #報文
read poly #多項(xiàng)式
l1=${#poly}
l2=${#message}
divisor=$message
for((i=1;i<l1;i++));
do
divisor=${divisor}"0"
done
for((i=0;i<$l2;i++)); #模二除法
do
if [ ${divisor:$i:1} = 1 ];
then
rem=""
for((j=0;j<$l1;j++));
do
rem=$rem$(((2#${divisor:`expr $i + $j`:1})^(2#${poly:$j:1})))
done
divisor=${divisor:0:$i}$rem${divisor:`expr $i + $l1`}
fi
done
echo $message${divisor:$l2:`expr $l1 - 1`}
echo $poly
#verifier.sh
#!/bin/bash
read message
read poly
l1=${#poly}
l2=${#message}
for((i=0;i<$l2;i++));
do
if [ ${message:$i:1} = 1 ];
then
rem=""
for((j=0;j<$l1;j++));
do
rem=$rem$(((2#${message:`expr $i + $j`:1})^(2#${poly:$j:1})))
done
message=${message:0:$i}$rem${message:`expr $i + $l1`}
fi
done
neg=0
for((i=0;i<l1;i++)); #判斷余數(shù)是否為零
do
if [ ${rem:i:1} != "0" ];
then
neg=1
fi
done
if [ $neg = 1 ];
then
echo "False"
else
echo "True"
fi
#alter.sh
#!/bin/bash
read message
read poly
neg=$(((2#${message:`expr $1 - 1`:1})^1)) #變反第arg位
message=${message:0:`expr $1 - 1`}$neg${message:$1}
echo $message
echo $poly
題目來源:《計算機(jī)網(wǎng)絡(luò)(第3版)》第三章課后習(xí)題No.38