免费注册 查看新帖 |

Chinaunix

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

[文本处理] BASH版本的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
11 [报告]
发表于 2014-01-26 14:42 |显示全部楼层
本帖最后由 bikkuri 于 2014-01-26 23:41 编辑

可是,楼主啊楼主,看来是我想得太天真了,有一部分盒子硬是不支持^和**运算啊。。。
  1. BusyBox v1.22.0 (2014-01-10 07:58:26 CET) built-in shell (ash)
  2. Enter 'help' for a list of built-in commands.

  3. root@box:~# awk 'BEGIN{printf("%i\n",5^3)}'
  4. root@box:~# awk 'BEGIN{printf("%i\n",5**3)}'
  5. root@box:~#
复制代码
看来还是得重新发明一下轮子啊。。。

论坛徽章:
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
12 [报告]
发表于 2014-01-27 03:16 |显示全部楼层
再次改写了这几个编码解码脚本,用循环*代替了^和**运算,这下总算在所有的盒子上都可以正常运行了。
  1. #!/bin/sh
  2. base64_decode()
  3. {
  4. local buff=""
  5. for buff in $(awk -v B64="$CODE" '{while(length()){split(substr($0,1,4),a,"");$0=substr($0,5);t=0;for(i=3;i>=0;i--){z=1;for(p=0;p<6*i;p++)z=z*2;t=t+z*((a[4-i]=="=")?0:index(B64,a[4-i])-1)}for(i=2;i>=0;i--)if(a[4-i]!="="){y=1;for(p=0;p<8*i;p++)y=y*2;printf("\\x%x",t/y);t%=y}}printf"\n"}');do printf "$buff"; done
  6. }
  7. CODE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  8. base64_decode
复制代码
  1. #!/bin/sh
  2. base64_encode()
  3. {
  4. hexdump -ve '1/1 "%d "'|awk -v B64="$CODE" '{for(i=1;i<=NF;i+=3){t=0;t=$i*256*256+$(i+1)*256+$(i+2);for(j=3;j>=0;j--){z=1;for(p=0;p<6*j;p++)z=z*2;c=(i+2-j<=NF)?substr(B64,int(t/z)+1,1):"=";printf("%c",c);t%=z;if(++k==76)printf"\n";k%=76}}}'
  5. }
  6. CODE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  7. base64_encode
复制代码
  1. #!/bin/sh
  2. uu_decode()
  3. {
  4. local buff=""
  5. 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
  6. }
  7. uu_decode
复制代码
  1. #!/bin/sh
  2. uu_encode()
  3. {
  4. 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):"`";printf("%c",c);t%=z}}printf"\n"}printf"`\n"}'
  5. }
  6. uu_encode
复制代码

论坛徽章:
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
13 [报告]
发表于 2014-02-04 05:13 |显示全部楼层
本帖最后由 bikkuri 于 2014-02-03 23:56 编辑

但是楼主啊,不好意思,我又发现一个问题:
这个base64编解码程序和标准的Linux下的base64程序不兼容?
用这个base64程序编码后的文件用标准的Linux自带的base64程序来解码后报错:
  1. [root@hp8 base]# base64 -d backup.tar.gz.64 |tar zx
  2. base64: invalid input

  3. gzip: stdin: unexpected end of file
  4. tar: Child returned status 1
  5. tar: Error exit delayed from previous errors
  6. [root@hp8 base]# cat backup.tar.gz.64 |base64 -d|tar zx
  7. base64: invalid input

  8. gzip: stdin: unexpected end of file
  9. tar: Child returned status 1
  10. tar: Error exit delayed from previous errors
复制代码
但是用这个base64程序来解码则没有任何问题,可以成功解码并解压缩出原来的文件。
  1. [root@hp8 base]# cat backup.tar.gz.64 |./64decode.sh |tar zx
  2. tar: tmp/hct.log: time stamp 2014-02-04 07:52:13 is 10876 s in the future
  3. tar: tmp/index.php: time stamp 2014-02-04 08:00:29 is 11372 s in the future
  4. tar: tmp/master.log: time stamp 2014-02-04 08:00:29 is 11372 s in the future
  5. tar: tmp/signaling.log.20140203.tgz: time stamp 2014-02-04 08:00:29 is 11372 s in the future
  6. tar: tmp/sync.log: time stamp 2014-02-04 07:55:29 is 11072 s in the future
  7. tar: tmp/vtn.log: time stamp 2014-02-04 07:55:29 is 11072 s in the future
  8. tar: tmp/xfer.log: time stamp 2014-02-04 08:00:22 is 11365 s in the future
  9. [root@hp8 base]#
复制代码
到底是什么导致了这个base64程序和标准的Linux下的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
14 [报告]
发表于 2014-02-04 06:00 |显示全部楼层
本帖最后由 bikkuri 于 2014-02-03 23:53 编辑

刚才用这个base64程序和Linux的标准base64程序同时对同一个文件进行编码,然后检查编码后的文本,
发现标准base64程序的输出结果比这个base64程序在文件结尾处多了一个0a换行字符。
  1. [root@hp8 base]# cat test.tgz |./64encode.sh > a.64
  2. [root@hp8 base]# cat test.tgz |base64 > b.64
  3. [root@hp8 base]# diff a.64 b.64
  4. 141c141
  5. < FpA8Z1kT3ym62gukZQs69VjWKdDN0aep/znJ2rgqyv91ewDfUJN9Pp///vsfyE3WdCQpAAA=
  6. \ No newline at end of file
  7. ---
  8. > FpA8Z1kT3ym62gukZQs69VjWKdDN0aep/znJ2rgqyv91ewDfUJN9Pp///vsfyE3WdCQpAAA=
  9. [root@hp8 base]# tail -n 1 a.64 |hexdump -C
  10. 00000000  46 70 41 38 5a 31 6b 54  33 79 6d 36 32 67 75 6b  |FpA8Z1kT3ym62guk|
  11. 00000010  5a 51 73 36 39 56 6a 57  4b 64 44 4e 30 61 65 70  |ZQs69VjWKdDN0aep|
  12. 00000020  2f 7a 6e 4a 32 72 67 71  79 76 39 31 65 77 44 66  |/znJ2rgqyv91ewDf|
  13. 00000030  55 4a 4e 39 50 70 2f 2f  2f 76 73 66 79 45 33 57  |UJN9Pp///vsfyE3W|
  14. 00000040  64 43 51 70 41 41 41 3d                           |dCQpAAA=|
  15. 00000048
  16. [root@hp8 base]# tail -n 1 b.64 |hexdump -C
  17. 00000000  46 70 41 38 5a 31 6b 54  33 79 6d 36 32 67 75 6b  |FpA8Z1kT3ym62guk|
  18. 00000010  5a 51 73 36 39 56 6a 57  4b 64 44 4e 30 61 65 70  |ZQs69VjWKdDN0aep|
  19. 00000020  2f 7a 6e 4a 32 72 67 71  79 76 39 31 65 77 44 66  |/znJ2rgqyv91ewDf|
  20. 00000030  55 4a 4e 39 50 70 2f 2f  2f 76 73 66 79 45 33 57  |UJN9Pp///vsfyE3W|
  21. 00000040  64 43 51 70 41 41 41 3d  0a                       |dCQpAAA=.|
  22. 00000049
复制代码
但是这应该没有问题啊?
后来在网上找了一下,据说RHEL5自带的base64工具有BUG,base64解码时莫名出错:base64: invalid input。
http://www.shangxueba.com/jingyan/121721.html
我的Linux服务器是CentOS release 5.4 (Final),可能跟这个bug也沾边靠谱。。。
  1. [root@hp8 base]# echo "Hello" | base64 | base64 -d
  2. Hello
  3. base64: invalid input
  4. [root@hp8 base]# echo -n $(echo "Hello"|base64)|base64 -d
  5. Hello
  6. [root@hp8 base]#
  7. [root@hp8 base]# echo "Hello"|base64|hexdump -C
  8. 00000000  53 47 56 73 62 47 38 4b  0a                       |SGVsbG8K.|
  9. 00000009
  10. [root@hp8 base]# echo -n $(echo "Hello"|base64)|hexdump -C
  11. 00000000  53 47 56 73 62 47 38 4b                           |SGVsbG8K|
  12. 00000008
  13. [root@hp8 base]#
  14. [root@hp8 base]# base64 --version
  15. base64 (GNU coreutils) 5.97
  16. Copyright (C) 2006 Free Software Foundation, Inc.
  17. This is free software.  You may redistribute copies of it under the terms of
  18. the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
  19. There is NO WARRANTY, to the extent permitted by law.

  20. Written by Simon Josefsson.
  21. [root@hp8 base]#
  22. [root@hp8 base]#
复制代码
哎。。。那就怪不得我了。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP