- 论坛徽章:
- 18
|
本帖最后由 bikkuri 于 2013-12-26 00:42 编辑
我在原来的程序里加了几句用来debug:- #!/bin/sh
- base64encode()
- {
- /usr/bin/awk -- '
- function asc(char,l_found)
- {
- l_found=0;
- for (i=0;i<=255;i++){
- if (sprintf("%c",i)==char) l_found=i;
- }
- return l_found;
- }
- function base64_and(var,x,l_res,l_i)
- {
- l_res=0;
- for (l_i=0;l_i<8;l_i++){
- if (var%2==1 && x%2==1) l_res=l_res/2+128;
- else l_res/=2;
- var=int(var/2);
- x=int(x/2);
- }
- return l_res;
- }
- function base64_lshift(var,x)
- {
- while(x>0){
- var*=2;
- x--;
- }
- return var;
- }
- function base64_rshift(var,x)
- {
- while(x>0){
- var=int(var/2);
- x--;
- }
- return var;
- }
- BEGIN{
- BASE64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- result="";
- }
- {
- while (length($0)>0){
- printf "Source: %s Length: %i\n",$0,length($0);
- if (length($0)==1){
- byte1=asc(substr($0,1,1));
- byte2=0;
- byte3=0;
- }
- if (length($0)==2){
- byte1=asc(substr($0,1,1));
- byte2=asc(substr($0,2,1));
- byte3=0;
- }
- if (length($0)>=3){
- byte1=asc(substr($0,1,1));
- byte2=asc(substr($0,2,1));
- byte3=asc(substr($0,3,1));
- }
- base1=base64_rshift(byte1,2);
- base2=base64_lshift(base64_and(byte1,3),4)+base64_rshift(base64_and(byte2,240),4);
- base3=base64_lshift(base64_and(byte2,15),2)+base64_rshift(base64_and(byte3,192),6);
- base4=base64_and(byte3,63);
- printf "byte1=%i byte2=%i byte3=%i\n", byte1, byte2, byte3;
- printf "base1=%i base2=%i base3=%i base4=%i\n", base1, base2, base3, base4;
- if (length($0)==1){
- result=result substr(BASE64,base1+1,1);
- result=result substr(BASE64,base2+1,1);
- result=result "==";
- $0="";
- }
- if (length($0)==2){
- result=result substr(BASE64,base1+1,1);
- result=result substr(BASE64,base2+1,1);
- result=result substr(BASE64,base3+1,1);
- result=result "=";
- $0="";
- }
- if (length($0)>=3){
- result=result substr(BASE64,base1+1,1);
- result=result substr(BASE64,base2+1,1);
- result=result substr(BASE64,base3+1,1);
- result=result substr(BASE64,base4+1,1);
- $0=substr($0,4);
- }
- printf "Result=%s\n", result;
- }
- printf "%s",result;
- }
- '
- }
- base64encode
复制代码 输出的结果如下:- root@unknown:/tmp/test# cat a.gz|./base64encode.sh > a.gz.encode
- root@unknown:/tmp/test# ls -l
- -rw-r--r-- 1 root root 124 Dec 25 16:59 a.64
- -rw-r--r-- 1 root root 26 Dec 25 16:59 a.gz
- -rw-r--r-- 1 root root 915 Dec 25 17:14 a.gz.encode
- -rwxr-xr-x 1 root root 1983 Dec 25 17:14 base64encode.sh
- -rwxr-xr-x 1 root root 748 Dec 25 16:34 decode.sh
- root@unknown:/tmp/test# cat a.gz.encode
- Source: ^_‹^H
- byte1=31 byte2=0 byte3=8
- base1=7 base2=48 base3=0 base4=8
- Result=HwAI
- HwAISource: þ^M»R^B^CóHÍÉÉç^B
- byte1=0 byte2=13 byte3=0
- base1=0 base2=0 base3=52 base4=0
- Result=HwAIAA0A
- Source: R^B^CóHÍÉÉç^B
- byte1=82 byte2=2 byte3=3
- base1=20 base2=32 base3=8 base4=3
- Result=HwAIAA0AUgID
- Source: óHÍÉÉç^B
- byte1=0 byte2=72 byte3=0
- base1=0 base2=4 base3=32 base4=0
- Result=HwAIAA0AUgIDAEgA
- Source: ÉÉç^B
- byte1=0 byte2=0 byte3=0
- base1=0 base2=0 base3=0 base4=0
- Result=HwAIAA0AUgIDAEgAAAAA
- Source: ^B
- byte1=2 byte2=0 byte3=0
- base1=0 base2=32 base3=0 base4=0
- Result=HwAIAA0AUgIDAEgAAAAAAg==
- HwAIAA0AUgIDAEgAAAAAAg==Source: ^V5–1^F
- byte1=22 byte2=53 byte3=0
- base1=5 base2=35 base3=20 base4=0
- Result=HwAIAA0AUgIDAEgAAAAAAg==FjUA
- Source: 1^F
- byte1=49 byte2=6 byte3=0
- base1=12 base2=16 base3=24 base4=0
- Result=HwAIAA0AUgIDAEgAAAAAAg==FjUAMQY=
- HwAIAA0AUgIDAEgAAAAAAg==FjUAMQY=HwAIAA0AUgIDAEgAAAAAAg==FjUAMQY=HwAIAA0AUgIDAEgAAAAAAg==FjUAMQY=
复制代码 看来编码程序处理的源字节和文件里的完全不一样啊。
我用Ultraedit看到原来的a.gz里的二进制字节如下:- 1F 8B 08 00 FE 0D BB 52 02 03 F3 48 CD C9 C9 E7
- 02 00 16 35 96 31 06 00 00 00
复制代码 为什么会有这样的差别呢?
回复 9# bikkuri
|
|