- 论坛徽章:
- 18
|
本帖最后由 bikkuri 于 2014-05-28 09:48 编辑
大家好!
我有一个困扰我很长时间的问题请大家帮忙。
我写了一个uuencode的编码和解码程序。
uuencode的编码规则详见:http://zh.wikipedia.org/wiki/Uuencode
编码程序如下:- #!/bin/sh
- uu_encode()
- {
- rm -f $encuu
- if [ -f /usr/bin/uuencode ] ; then
- for buff in $(hexdump -ve '1/1 "%x "'); do printf "\x$buff" >> $encuu; done
- uuencode $encuu $encuu|awk 'NR>2{print p}{p=$0}'
- rm -f $encuu
- else
- hexdump -ve '1/1 "%d "'|awk '{for(k=0;k*45<=NF;k++){m=(45*k+45<NF)?77:(NF+32-45*k);printf("%c",m);for(i=1;i<=m-32;i+=3){t=0;t=$(i+k*45)*256*256+$(i+k*45+1)*256+$(i+k*45+2);for(j=3;j>=0;j--){z=1;for(p=0;p<6*j;p++)z=z*2;c=(i+34-j<=m)?(int(t/z)+32):"`";if(c==32)c=96;printf("%c",c);t%=z}}printf"\n"}printf"`\n"}'
- fi
- }
- encuu=/tmp/uu.enc
- uu_encode
复制代码 解码程序如下:- #!/bin/sh
- uu_decode()
- {
- if [ -f /usr/bin/uudecode ] ; then
- echo "begin 644 b" > $decuu
- awk NF >> $decuu
- echo "end" >> $decuu
- uudecode -o $outuu $decuu
- cat $outuu
- rm -f $decuu $outuu
- else
- local buff=""
- for buff in $(awk '{for(l=0;l<NR;l++){h=substr($0,1,1);$0=substr($0,2);if(h!="`"){while(length($0)>0){split(substr($0,1,4),a,"");$0=substr($0,5);t=0;for(i=3;i>=0;i--){for(c=32;c<96;c++){if(sprintf("%c",c)==a[4-i])break}z=1;for(p=0;p<6*i;p++)z=z*2;t=t+z*((a[4-i]=="`")?0:c-32)};for (j=2;j>=0;j--) if (a[4-j]!="`"){y=1;for(p=0;p<8*j;p++)y=y*2;printf("\\x%x",t/y);t%=y}}}}printf"\n"}');do printf "$buff";done
- fi
- }
- decuu=/tmp/uu.dec
- outuu=/tmp/uu.out
- uu_decode
复制代码 编码程序和解码程序中首先判断系统有没有自带的uuencode和uudecode命令,如果有的话,则直接使用系统自带的命令,如果没有的话,则用awk进行编码和解码运算。
因为用系统自带的命令执行效率远比用awk来运算要高,所以只有系统没有自带编解码命令的时候才用awk来编解码。
但是现在发现两者编解码出来的内容不一致!- root@nbox:/tmp/test/uu# gzip -c uudecode_final.sh |./uuencode_final.sh
- M'XL(`/PXA5,"`UV2P7*;,!"&[WJ*C8HGD@T!8]?35I9SRS&'7&-/"[(((@08
- MD";!#.\>`;'K5B?MM[O__IK5MQL_5H7?I,B8WT<IRJ,D%'5()?`,7@*^:>JQ
- MPI@I"P=@H%-9("G2$G`L7U0!F_4:8@P[<&R5,2AZ?X7'!]A=P%0LBR.^@A=-
- MKP2G--J8<T9$^HN@^FWP,?$SDWDC45Z**(?8)`G'&"5E/=[!NG'(,/^VLXSD
- M/&#Y]O&)Y8L%[5+>F+C1-7$"=^DN*7."*Q)2IA*2WG#\!]/N/56Y)+DL7G1J
- MLW07T*ZI<J7)M<::NI&+\7]*WRG3=O!@0/$54SL;*,^CHR7!5R$3VY\;)@9/
- M=F13U:K0"<$S@5U!.8^>UYXZT+B6T6M_XLM1J;(BU78S5ZRR?2=^FH=VBEZ<
- MYH1,#7QT?A_\$MXJI/W0!23C(<L&`YDU`':Q8W%V^'IF^X_ZCWDVJK>\M>IG
- M6_O]Q^P#N]IO[;MFO.WMF7)X7^#^EK)C"1,`[`QKP)84$B4*]6A<'??U6V5_
- 6T9V-T+C%"['1W]^'/@%23X'>D@(`````
- `
- root@nbox:/tmp/test/uu#
- ------------------------------------------------------------------------------------------------
- root@dbox:/tmp/test/uu# gzip -c uudecode_final.sh |./uuencode_final.sh
- M'XL(`->]A%,"`UV2P7*;,!"&[WJ*C8HGD@T!8]?35I9SRS&'7&-/"[(((@08
- MD";!#.\>`;'K5B?MM[O__IK5MQL_5H7?I,B8WT<IRJ,D%'5()?`,7@*^:>JQ
- MPI@I"P=@H%-9("G2$G`L7U0!F_4:8@P[<&R5,2AZ?X7'!]A=P%0LBR.^@A=-
- MKP2G--J8<T9$^HN@^FWP,?$SDWDC45Z**(?8)`G'&"5E/=[!NG'(,/^VLXSD
- M/&#Y]O&)Y8L%[5+>F+C1-7$"=^DN*7."*Q)2IA*2WG#\!]/N/56Y)+DL7G1J
- MLW07T*ZI<J7)M<::NI&+\7]*WRG3=O!@0/$54SL;*,^CHR7!5R$3VY\;)@9/
- M=F13U:K0"<$S@5U!.8^>UYXZT+B6T6M_XLM1J;(BU78S5ZRR?2=^FH=VBEZ<
- MYH1,#7QT?A_\$MXJI/W0!23C(<L&`YDU`':Q8W%V^'IF^X_ZCWDVJK>\M>IG
- M6_O]Q^P#N]IO[;MFO.WMF7)X7^#^EK)C"1,`[`QKP)84$B4*]6A<'??U6V5_
- 6T9V-T+C%"['1W]^'/@%23X'>D@(`````
- `
- root@dbox:/tmp/test/uu#
复制代码 大家可以看到在nbox上是有自带的uuencode和uudecode命令的,所以nbox上应该是标准的uuencode编码结果。
dbox是没有自带的uuencode和uudecode命令的,所以dbox上是awk运算出来的编码结果。
两者乍一看非常相似,但是仔细看可以发现从第7个字符开始有细微的差异。
请大家帮忙看看我的程序错在什么地方呢?
谢谢了! |
|