免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: bikkuri
打印 上一主题 下一主题

[文本处理] 用awk写的base64编码脚本,大家帮忙修改一下! [复制链接]

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
31 [报告]
发表于 2013-12-27 23:38 |只看该作者
本帖最后由 bikkuri 于 2013-12-28 00:00 编辑

好象这段awk代码还有问题啊,在转换一个大一点的文件的时候,就把右边的二进制的内容输出来了.
如下的第2, 7, 24, 28, 33都有不正常的输出内容.
  1. 1f 8b 08 00 9d d2 bd 52 02 03 c5 1a fb 7b d3 46 f2 77 fd 15 53 c5 e0 b8 ad 63 3d fc ee 39 df 19 27 2d 39 20 70 04 8e 8f a6 b9 54 96
  2. d6 b6 88 2c |'-9 a9 5a 39 c6 10 fe f7 9b d9 5d 3d ec d8 21 14 f8 2e 10 47 bb 3b 33 3b 33 3b cf 95 f7 7e 68 8c fd b0 c1 67 da 9e b6 0
  3. 7 c3 45 1a 39 31 70 37 f1 e3 14 26 51 02 8f 92 c8 f1 dc 68 0e a3 99 1f 73 96 c2 d1 51 fd cd cb 57 f0 32 5a a4 2c e1 88 f3 1f fc e3 4
  4. 7 61 1f 2c c3 b4 eb a6 55 b7 5a 70 ce 9d 6b e6 81 c3 a1 91 ce e3 86 bb e0 69 34 3f e0 b3 0b 84 7f 13 25 57 1c c6 8c a7 b0 f4 d3 59 4
  5. e 90 05 cc e1 ac 0f 46 a7 61 35 1b a6 0d fb 89 65 99 66 b7 26 38 1b 45 f3 b9 13 7a f0 d4 0f 11 26 27 08 e7 6e 14 44 c9 05 9c 07 91 e
  6. b a4 c8 07 3e 3a 28 c5 8d 3b 73 c2 29 bb 09 23 f5 90 b0 71 14 a5 b8 9a 26 fe 74 ca 92 3e 3d bb 09 f3 fc b4 ef 5e 88 3d 4e 42 9e 3a 4
  7. 1 00 3c 65 31 ef 03 ce 9c eb 43 6f ee 87 3e 4f 13 41 5c af 1f ea 8a 13 8e cf a3 28 5e 3d 7c e1 20 3c a4 33 9f c3 c4 0f 18 f8 |.(^=|.
  8. 61 1a e1 90 1e e2 45 0a 29 7b 9f c2 38 7a 8f 43 c8 70 e1 6c c6 82 40 07 a4 76 86 8a 82 91 10 07 ce 84 da 75 c9 cc d9 d9 c9 11 3c 3d
  9. 39 7b 05 fb 67 cc 5d 24 7e ba 82 67 91 c7 e0 cd 8b a1 05 51 18 ac 50 31 90 49 3d a8 12 bc d9 7f 72 fc d6 14 a8 16 3d 5a e2 d1 a6 47
  10. bb aa ed d5 3f f3 f3 e6 f5 e3 e1 29 fc eb e4 f4 ec f1 f0 ed c9 e9 ef af 9f df 01 bc a7 2d 17 a8 d9 41 f5 bd ef 44 ef 16 61 df ec 75
  11. 3b 46 c7 b2 91 e9 d3 27 f5 df 9f f6 cd 6e db ea f4 ec 1e 3c f3 13 14 da 79 1c cd 19 42 f5 0c c3 32 db 60 d5 3b 46 1b 87 6d db 34 d0
  12. 72 7a bd ae 61 5a 1d 78 f5 a2 4e f8 97 06 0e fb a6 dd eb 98 66 a7 67 34 ad 7c a1 d7 1d 99 d6 90 e8 d8 86 6d 1b f9 7c b7 dd ed b6 ba
  13. c4 45 cb b0 ad 66 3e 6f 37 4d b3 37 ec 3b 1c 31 3a bd 6e 3e 3f 1a 8e da ed 51 bf db 34 3a b8 97 01 33 e2 ae 83 1b 4e 27 1e 87 55 b4
  14. 8a fa f4 61 f4 8c 16 3c 1b 3e c7 ff 4f 87 27 4f 8f fb cd 9e 33 b6 db e9 04 39 87 d0 77 67 51 e0 f0 fe 87 89 69 37 ed 8e d9 ee 34 4d
  15. 03 cc 2e b2 dd ec f4 85 82 2c 14 d7 e8 9a ed 7b e8 1f d5 7e fa db e3 e1 09 fc fb e4 d1 f0 f9 67 80 f7 b4 bf fc b1 13 0d aa 99 40 ef
  16. a2 d0 49 71 43 d4 5a b3 6b b5 4c a3 8d da 69 b6 ea 36 2a 72 85 2e b0 c0 5f 13 8f 27 83 b7 0c 0b 8f a8 63 76 90 db 66 ab 0b cf 8e 5f
  17. 8e 5e bf 7c 7b d9 b5 8f db bf 1a fd 76 b3 6d b6 6c bb 9d cf 37 0d 73 64 1c f7 91 44 b3 d5 46 24 e3 4b 24 1a 0d 9f 3f 3e 46 cb fa ed
  18. 4e 89 5c 27 9a b1 77 7e 38 1d 54 f9 2c f1 fa 89 37 0b fe 49 1f 40 43 ab 18 df 63 eb 2f fa d9 d3 32 47 e2 83 aa 38 36 10 da 85 9c a3
  19. aa e6 b1 89 b3 08 d2 81 58 d0 bc 99 1b a7 fe 9c 61 18 1c d8 86 36 8b 78 6a 0e 96 cb e5 01 f7 43 e7 00 03 e6 81 1b 8a 59 4b cc 8e 1d
  20. df 5b d0 b4 98 b3 c5 5c c8 52 8a 78 62 d6 0d 06 22 52 7e 38 70 67 c1 54 73 27 f9 10 23 94 16 e7 43 64 f3 4a 0b ca 43 47 0b dd 6c 48
  21. c1 4e 8b fd 6c 18 23 df 1a cf 87 9c fb 9e 96 e6 b8 14 07 51 ec e9 a0 71 ed 24 0d 7c 68 cc 19 e7 ce 94 71 6d a1 80 68 21 59 84 8d 05
  22. 49 eb 22 3d 6f a7 de 7f 7d 7d 3a 7a 75 f2 fc f4 ec 4e 3d 6b 09 86 7d 27 49 2f 25 c5 fd 9a f6 51 23 b6 06 15 53 bb 62 ab 41 c5 d2 ae
  23. 7c 8c c0 f5 1e 54 f6 f1 40 a0 b2 98 d4 b4 65 00 9e cf 1d ce 23 97 9e 97 9c b9 60 80 75 d8 f0 d8 75 23 5c 04 81 16 5e 27 ce 1c 28 3d
  24. 2d 9d f0 d2 8f 1d cf 4b 06 ba 71 20 fe e9 1b cb |-......K..q a8 f7 b9 c3 af 76 ae 4f 9d 94 2d 9d d5 ee 75 96 5e 7a 68 28 fa e6 82 4
  25. 8 60 88 a6 13 97 7c 11 5f 2e 63 07 8c f2 c0 14 03 c4 8f e7 57 50 41 89 69 fc 2e c2 d4 50 21 35 80 33 a7 08 8f 90 56 cc af 36 a8 c7 4
  26. 9 94 46 03 d2 9b e6 4f e0 1c ea 13 68 2c 78 d2 e0 94 bf 97 81 1b 85 13 b8 80 5f 28 f5 84 9a 1a 57 f6 25 8d 29 d1 08 8c 4b 7f 12 3a 7
  27. 3 56 03 2f 5a 86 6b 0a fc 0c fc 22 5e 83 66 01 67 c8 04 a1 f8 d3 3b 90 3e 0f 43 8c 68 13 5f c3 fc 87 d5 45 72 ed bb 8c 84 d5 78 c0 5
  28. 8 0c b6 26 ac a5 bc 20 0d 07 ea fe 4e 92 f5 98 ac 06 ea aa f6 |.. 50 08 87 90 b3 8f a2 3c 34 e1 a1 e6 0e 2a 25 2f d6 96 33 ca de e7
  29. 50 41 ea d3 14 0d ec 02 1e 3e c4 b1 5e d9 c7 8d fd b8 a6 c3 00 72 9b 80 7a b4 b1 a2 0b ed 7b 51 ce 3b d2 df df af b8 75 bb 56 d3 bc
  30. 28 64 da 27 4d 13 f0 c2 ec 19 a6 8e 75 19 72 cb ad 11 a4 b2 c2 dd b0 0a 40 00 a7 e8 56 97 8a f0 4e 8e 2f e0 e6 e6 96 3c f9 74 65 3f
  31. a1 92 0e ea 21 dc 4c 13 14 a0 ee 82 fe df 0c 19 d5 ca fe ca 74 22 d8 d1 c7 8e a7 13 aa 1c 4d a3 c8 d3 05 df 64 dd 18 78 04 2f e8 ee
  32. 14 32 2b fb 34 83 14 6d a8 98 8a 3c ee 16 7a 37 2e 56 48 75 0f f4 06 2a 74 d2 cc 87 07 34 34 6b 42 16 49 23 67 16 f7 57 54 7b f8 a3
  33. 54 23 67 72 4d e4 fb 93 58 4a 37 35 22 20 78 ce 68 94 02 11 cd c8 63 6b 49 e7 |75" fa 01 11 73 cc 32 aa f4 2f d0 62 13 a5 ca 64 85 8
  34. a 88 ff 35 2d b6 6e cd 5a 38 6b df 9a b5 49 b6 4a 6c a2 a9 31 fc 6b ad 09 46 63 54 6c 3e 32 09 56 8e 14 bc bd 01 6f 97 21 f0 97 54 5
  35. 3 3a ab 6c 29 3f 2d 12 46 7a 71 69 8c 6e a8 ce cf b9 76 fc e0 92 22 12 17 6a 74 44 b0 cb 1c 44 af 38 7c dd e2 71 bd b2 cf fd 94 5d f
  36. 2 45 72 cd 56 60 ae bb 9b f4 c4 00 cb 68 84 a7 b0 9e 8f a5 2d 50 95 2a cf de 35 4d 2c 58 94 bf 48 de 1d 9e b1 95 e5 68 c9 53 c1 a3 d
复制代码
另外还想问一下,如果要改原来的编码程序的话,以前是用substr从input里取3个字节赋值给byte1,byte2和byte3然后进行编码,
现在input变成这样的十六进制数字的文本的话,如何给byte1,byte2和byte3最有效呢?
应该不用写一个hextodec的十六进制转十进制函数吧?

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
32 [报告]
发表于 2013-12-29 13:54 |只看该作者
我发现可以用byte1=sprintf ("%d", "0x" $1);来把输入中的十六进制数转换成十进制然后赋值给byte1。
但是赋值完如果substr($0,1,4)的话,$1就变成下一个数了吗?
如果不执行substr的话,怎么判断输入结束了呢?

论坛徽章:
771
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
33 [报告]
发表于 2013-12-30 10:22 |只看该作者
回复 31# bikkuri
我是参照那个样本数据写的代码,取得是2到NF-1这些字段,
可能处理实际数据,会有些偏差,可以加个正则判断每一个
$i是不是[0-9a-f]{2}就不会取到乱码了。
  1. echo "c4 0f 18 f8 |.(^=|. 61 1a e1"|awk --re-interval '{for(i=2;i<NF;i++)if($i~/[0-9a-f]{2}/)s=s?s" "$i:$i}END{print s}'

  2. 0f 18 f8 61 1a
复制代码

论坛徽章:
771
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
34 [报告]
发表于 2013-12-30 10:23 |只看该作者
回复 32# bikkuri
substr好像不影响$0,$1的吧,不理解。


   

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
35 [报告]
发表于 2013-12-30 20:15 |只看该作者
本帖最后由 damcool 于 2013-12-30 20:16 编辑

base64encode.awk
  1. function bit_lshift(nbr, bits){
  2.         return int(nbr/2^bits);
  3. }

  4. function base64encode(dst_nbr, i)
  5. {
  6.         for (i=3;i>=0;i--)
  7.         {
  8.                 BASE64ENCODE=BASE64ENCODE""BASE64[bit_lshift(dst_nbr,6*i)+1];
  9.                 dst_nbr=dst_nbr % 2^(6*i);
  10.         }
  11. }

  12. BEGIN{
  13.         split("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",BASE64,"");
  14.         BASE64ENCODE="";
  15. }
  16. {
  17.         for (i=1;i<=NF;i+=3) base64encode($i*256*256+$(i+1)*256+$(i+2));

  18.         if (i!=NF+1)
  19.         {
  20.                 BASE64ENCODE=substr(BASE64ENCODE,1,length(BASE64ENCODE)-i+1+NF);
  21.                 while (length(BASE64ENCODE)%4!=0) BASE64ENCODE=BASE64ENCODE"=";               
  22.         }
  23.         while(length(BASE64ENCODE)>0)
  24.         {
  25.                 printf "%s\n",substr(BASE64ENCODE,1,76);
  26.                 BASE64ENCODE=substr(BASE64ENCODE,77,length(BASE64ENCODE));
  27.         }
  28. }
复制代码
  1. hexdump -ve '1/1 "%d "' /usr/bin/awk|awk -f scripts/base64encode.awk >awk.base64.enc.sh
  2. base64 /usr/bin/awk >awk.base64.enc
  3. diff awk.base64.enc awk.base64.enc.sh
复制代码

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
36 [报告]
发表于 2013-12-30 22:16 |只看该作者
本帖最后由 bikkuri 于 2013-12-30 22:20 编辑

谢谢您的回复和您的程序!
您的程序比我写的简练多了,学习了!
以下是我修改后的可以在busybox下正确运行的base64编码脚本,
最后再次感谢大家的指点和帮助。
  1. #!/bin/sh
  2. base64encode()
  3. {
  4. /usr/bin/awk -- '
  5. function base64_and(var,x,l_res,l_i)
  6. {
  7.         l_res=0;
  8.         for (l_i=0;l_i<8;l_i++){
  9.                 if (var%2==1 && x%2==1) l_res=l_res/2+128;
  10.                 else l_res/=2;
  11.                        var=int(var/2);
  12.                 x=int(x/2);
  13.         }
  14.         return l_res;
  15. }

  16. function base64_lshift(var,x)
  17. {
  18.         while(x>0){
  19.         var*=2;
  20.         x--;
  21.         }
  22.         return var;
  23. }

  24. function base64_rshift(var,x)
  25. {
  26.         while(x>0){
  27.         var=int(var/2);
  28.         x--;
  29.         }
  30.         return var;
  31. }

  32. BEGIN{
  33. BASE64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  34. result="";
  35. }

  36. {
  37. for (i=1;i<=NF;i=i+3)
  38. {
  39. byte1=sprintf ("%d", "0x" $i);
  40. byte2=sprintf ("%d", "0x" $(i+1));
  41. byte3=sprintf ("%d", "0x" $(i+2));

  42.                 base1=base64_rshift(byte1,2);
  43.                 base2=base64_lshift(base64_and(byte1,3),4)+base64_rshift(base64_and(byte2,240),4);
  44.                 base3=base64_lshift(base64_and(byte2,15),2)+base64_rshift(base64_and(byte3,192),6);
  45.                 base4=base64_and(byte3,63);
  46. # printf "byte1=%i byte2=%i byte3=%i\n", byte1, byte2, byte3;
  47. # printf "base1=%i base2=%i base3=%i base4=%i\n", base1, base2, base3, base4;
  48.                 if (NF-i==1){
  49.                         result=result substr(BASE64,base1+1,1);
  50.                         result=result substr(BASE64,base2+1,1);
  51.                         result=result "==";
  52.                 }

  53.                 if (NF-i==2){
  54.                         result=result substr(BASE64,base1+1,1);
  55.                         result=result substr(BASE64,base2+1,1);
  56.                         result=result substr(BASE64,base3+1,1);
  57.                         result=result "=";
  58.                 }

  59.                 if (NF-i>=3){
  60.                         result=result substr(BASE64,base1+1,1);
  61.                         result=result substr(BASE64,base2+1,1);
  62.                         result=result substr(BASE64,base3+1,1);
  63.                         result=result substr(BASE64,base4+1,1);
  64.                 }
  65. # printf "Result=%s\n", result;
  66.         }

  67.         printf "%s",result;
  68. }
  69. '
  70. }
  71. base64encode
复制代码
回复 35# damcool


   

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
37 [报告]
发表于 2013-12-30 22:51 |只看该作者
刚才试了一下执行这两个程序,发现对如下同样的一个二进制文件进行编码后,结果相差一个字节。
  1. root@unknown:/tmp/test# echo "Hello" > a
  2. root@unknown:/tmp/test# gzip a
  3. root@unknown:/tmp/test# ls -l a.gz
  4. -rw-r--r--    1 root     root            26 Dec 30 22:31 a.gz
复制代码
damcool的程序的编码结果比我的程序的编码程序要多一个字节。
  1. root@unknown:/tmp/test# cat a.gz|hexdump -ve '1/1 "%d "'|awk -f ./base64encode.awk >a.64.1
  2. root@unknown:/tmp/test# cat a.gz|hexdump -ve '/1 "%02x "'|./encode.sh  >a.64.2
  3. root@unknown:/tmp/test# ls -l a.64*
  4. -rw-r--r--    1 root     root            37 Dec 30 22:44 a.64.1
  5. -rw-r--r--    1 root     root            36 Dec 30 22:45 a.64.2
  6. root@unknown:/tmp/test#
复制代码
  1. root@unknown:/tmp/test# cat a.64.1|./decode.sh > b.gz
  2. root@unknown:/tmp/test# cat a.64.2|./decode.sh > c.gz
  3. root@unknown:/tmp/test# ls -l *.gz
  4. -rw-r--r--    1 root     root            26 Dec 30 22:31 a.gz
  5. -rw-r--r--    1 root     root            26 Dec 30 22:47 b.gz
  6. -rw-r--r--    1 root     root            25 Dec 30 22:47 c.gz
  7. root@unknown:/tmp/test#
复制代码
  1. root@unknown:/tmp/test# gzip -cd b.gz > b
  2. root@unknown:/tmp/test# gzip -cd c.gz > c
  3. root@unknown:/tmp/test# cat b c
  4. Hello
  5. Hello
  6. root@unknown:/tmp/test# ls -l b c
  7. -rw-r--r--    1 root     root             6 Dec 30 22:48 b
  8. -rw-r--r--    1 root     root             6 Dec 30 22:48 c
  9. root@unknown:/tmp/test#
复制代码
  1. root@unknown:/tmp/test# ls -l
  2. -rw-r--r--    1 root     root            37 Dec 30 22:24 a.64.1
  3. -rw-r--r--    1 root     root            36 Dec 30 22:29 a.64.2
  4. -rw-r--r--    1 root     root            26 Dec 30 22:31 a.gz
  5. -rw-r--r--    1 root     root             6 Dec 30 22:28 b
  6. -rw-r--r--    1 root     root            26 Dec 30 22:27 b.gz
  7. -rw-r--r--    1 root     root           887 Dec 30 22:07 base64encode.awk
  8. -rw-r--r--    1 root     root             6 Dec 30 22:30 c
  9. -rw-r--r--    1 root     root            25 Dec 30 22:30 c.gz
  10. -rwxr-xr-x    1 root     root           748 Dec 30 22:27 decode.sh
  11. -rwxr-xr-x    1 root     root          2115 Dec 30 22:25 encode.sh
复制代码
然后再base64解码成二进制文件后,发现damcool的程序编码的文件解码后和原文件长度一致,而我的程序编码后再解码比原文件要少一个字节。
但是都可以正确用gzip解压还原成最初的"Hello"。
  1. root@unknown:/tmp/test# cat a.64*
  2. H4sIAInywVICA/NIzcnJ5wIAFjWWMQYAAAA=
  3. H4sIAInywVICA/NIzcnJ5wIAFjWWMQYAAA==root@unknown:/tmp/test# cat b c
  4. Hello
  5. Hello
  6. root@unknown:/tmp/test#
复制代码
从base64编码后的文件对比来看,damcool的编码文件比我的编码文件多一个换行,然后最后倒数第二个字节他是A,我是=。

为什么会有这样的差别呢?从最后解码及解压的结果来看,这种差别对解码的正确性没有影响吗?还是仅仅是这个例子没有影响?
我的程序什么地方还有问题导致编码最后的处理有偏差呢?

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
38 [报告]
发表于 2013-12-30 23:08 |只看该作者
本帖最后由 bikkuri 于 2013-12-31 10:37 编辑

又试了一个更大一点的文件长度为1603字节的list文件,发现编码后damcool的编码文件为621字节,我的为608字节,足足差了13字节!
我想这下完了,肯定我的程序这次错得离谱了。
但是没想到解码后damcool的解码文件为457字节,我的为456字节,又只差了1字节!
然后再分别解压缩,两者解压后的文件都是1603字节,和源文件长度相同。
  1. root@unknown:/tmp/test# ls -l
  2. -rw-r--r--    1 root     root           621 Dec 30 22:57 a.64.1
  3. -rw-r--r--    1 root     root           608 Dec 30 22:58 a.64.2
  4. -rw-r--r--    1 root     root          1603 Dec 30 22:59 b
  5. -rw-r--r--    1 root     root           457 Dec 30 22:59 b.gz
  6. -rw-r--r--    1 root     root           887 Dec 30 22:07 base64encode.awk
  7. -rw-r--r--    1 root     root          1603 Dec 30 22:59 c
  8. -rw-r--r--    1 root     root           456 Dec 30 22:59 c.gz
  9. -rwxr-xr-x    1 root     root           748 Dec 30 22:27 decode.sh
  10. -rwxr-xr-x    1 root     root          2115 Dec 30 22:25 encode.sh
  11. -rw-r--r--    1 root     root          1603 Dec 30 22:59 list
  12. -rw-r--r--    1 root     root           457 Dec 30 22:56 list.gz
复制代码
比较编码文件的内容发现,原来damcool的编码文件比我的编码文件多了9个换行(这个可以无视)和最后的4个字节他有我没有。
  1. root@unknown:/tmp/test# cat a.64*
  2. H4sIAAz6wVICA72U32qkMBTG7/sUeQEhiYlxDvRCo3aHznZlZ6GFIEtq045lGruOFvr2m87ijJb+
  3. GRem5+okB8z34/uOpl0RQHP7pNfVDdLNXfdgbHty3d2ujT1VPqa4QE+m2VS1OxIcFqisO9ueKlGc
  4. KOSGy+U8UWhbv3JvMb84/80wzWRQoHg7SzFgDpIDw0AzeBmUK22tWSskCnTbmD+dseWzoozRAjWb
  5. TaW8metsXW3Mv/ba6LK27n33YKkfFfNJgW7a6kG5i0a3xil1nfuMOmvq7tGL0qUn5fcc5bpq9qfL
  6. PKJevjxHL+LJSHxfjHs+Jr34KATilCdAU8gk8HQgfjYWz3fiRThRPOEHit9qP5yQjgnlqrL6wrTe
  7. ffXtricMKUQcSAwiAJKBj/eEhIwJgx1hyCcScnYUQP9NC10tfix6QCIhiyAIIcPgU0iiQyycnL9j
  8. WcgGhP1+3ddWtw6hJ6QhUAkxhVkGQQB0uGH+mJDuQyo+JPz/BZsIyN/J6M/06rkHjBkwAiICnEGS
  9. ODsHgK8ySvYWfpJR8kUZDV5ntLeRYroDlJA4QAEidvbBbOhgMAb0xW4JybH+kZMI/wIIfltlQwYA
  10. AA==
  11. H4sIAAz6wVICA72U32qkMBTG7/sUeQEhiYlxDvRCo3aHznZlZ6GFIEtq045lGruOFvr2m87ijJb+GRem5+okB8z34/uOpl0RQHP7pNfVDdLNXfdgbHty3d2ujT1VPqa4QE+m
  12. 2VS1OxIcFqisO9ueKlGcKOSGy+U8UWhbv3JvMb84/80wzWRQoHg7SzFgDpIDw0AzeBmUK22tWSskCnTbmD+dseWzoozRAjWbTaW8metsXW3Mv/ba6LK27n33YKkfFfNJgW7a
  13. 6kG5i0a3xil1nfuMOmvq7tGL0qUn5fcc5bpq9qfLPKJevjxHL+LJSHxfjHs+Jr34KATilCdAU8gk8HQgfjYWz3fiRThRPOEHit9qP5yQjgnlqrL6wrTeffXtricMKUQcSAwi
  14. AJKBj/eEhIwJgx1hyCcScnYUQP9NC10tfix6QCIhiyAIIcPgU0iiQyycnL9jWcgGhP1+3ddWtw6hJ6QhUAkxhVkGQQB0uGH+mJDuQyo+JPz/BZsIyN/J6M/06rkHjBkwAiIC
  15. nEGSODsHgK8ySvYWfpJR8kUZDV5ntLeRYroDlJA4QAEidvbBbOhgMAb0xW4JybH+kZMI/wIIfltlQwYAroot@unknown:/tmp/test#
复制代码
看来确实在最后一个字节的处理上我的程序还有问题啊?但是为什么不会影响解码和解压缩呢?

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
39 [报告]
发表于 2013-12-31 08:18 |只看该作者
bikkuri 发表于 2013-12-30 23:08
又试了一个更大一点的文件长度为1163字节的list文件,发现编码后damcool的编码文件为621字节,我的为608字节 ...


一个问题按照RFC要求base64encode需要每76字符换行,少最后4个字符,我觉得你没有处理不足三字节的情况。

论坛徽章:
771
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
40 [报告]
发表于 2013-12-31 09:30 |只看该作者
回复 39# damcool
精通规范的业内人士来了,咱们这种背景不熟
的遇到救星了。


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP