免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 10528 | 回复: 8
打印 上一主题 下一主题

[文本处理] BASH版本的base64 [复制链接]

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-31 22:59 |显示全部楼层 |倒序浏览
本帖最后由 damcool 于 2014-01-03 09:22 编辑

AWK版本的base64编解码脚本有很多限制,特别是在busybox下,作为新年礼物写了一些BASH版本的。如果busybox有hexdump的话。基本上没什么问题了。速度还可以吧。
更新说明
1、去除xargs对脚本兼容性影响
2、加入对管道输入的支持
  1. #!/bin/bash

  2. ################################################################################
  3. # Function Name:   HELP_USAGE                                                   
  4. # Description:     Function to display the usage of the script                  
  5. # Parameters:      None                                                         
  6. # Return:          Help messages                                                
  7. # Called By:       Script Main Loop->Script Parameters' Handler                 
  8. # History:         2013-Dec-31 Initial Edition                       RobinHoo  
  9. ################################################################################

  10. function help_usage(){
  11. cat <<EOF
  12. BASE64 ENCODE & DECODE BASH SCRIPT
  13. Usage: $PROGNAME [OPTION]... [FILE]
  14.   -d, --decode Decode the base64 encoded file
  15.   -h, --help   Show current help message of the script usages
  16.    

  17. Please Report Script Bugs to $AUTHOR_MAIL
  18. EOF
  19. exit 1
  20. }

  21. function BASE64ENCODE()
  22. {
  23.         hexdump -ve '1/1 "%d "' < "$FNAME"|awk -v B64="$BASE64CODE" '{for(i=1;i<=NF;i+=3){t=0;t=$i*256*256+$(i+1)*256+$(i+2);for(j=3;j>=0;j--){c=(i+2-j<=NF)?substr(B64,int(t/2^(6*j))+1,1):"=";printf("%c",c);t%=2^(6*j);if (++k==76) printf"\n";k%=76}}}'
  24. }

  25. function BASE64DECODE()
  26. {
  27.         local buff=""
  28.         for buff in $(cat < "$FNAME"|awk -v B64="$BASE64CODE" '{while(length()){split(substr($0,1,4),a,"");$0=substr($0,5);t=0;for(i=3;i>=0;i--) t=t+2^(6*i)*((a[4-i]=="=")?0:index(B64,a[4-i])-1);for (i=2;i>=0;i--) if (a[4-i]!="="){printf("\\x%x",t/2^(8*i));t=t%2^(8*i)}}printf"\n"}');do printf "$buff"; done
  29. }
  30. BASE_DIR=$(cd "$(dirname "$0")" && pwd)
  31. PROGNAME=$(basename "$0")
  32. AUTHOR_MAIL="robin.hoo@hotmail.com"
  33. BASE64CODE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  34. DECODE=0;
  35. HELP=0;
  36. FNAME="";
  37. while [ $# -gt 0 ]
  38. do
  39.     case "$1" in
  40.     (-d)        DECODE=1;;
  41.     (-h)        HELP=1;;
  42.     (--decode)  DECODE=1;;
  43.     (--help)    HELP=1;;
  44.     (-*)        echo "$PROGNAME: error - unrecognized option or parameter $1" 1>&2; HELP=1;break;;
  45.     (*)         [ "$FNAME" != "" ] && echo "$PROGNAME: error - more than one file name " 1>&2 && HELP=1 && break || FNAME="$1";;
  46.     esac
  47.     shift
  48. done
  49. [ $# -gt 1 ] && HELP=1
  50. [ "$FNAME" == "" ] && FNAME="/dev/stdin"
  51. [ $HELP -eq 1 ] && help_usage

  52. [ $DECODE -eq 1 ] && BASE64DECODE || BASE64ENCODE
复制代码

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
2 [报告]
发表于 2014-01-01 10:22 |显示全部楼层
1.Please forget the AWK solution at all
2.Check out the xargs usage in busybox & adjust the decode line accordingly.

Happy New Year !

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
3 [报告]
发表于 2014-01-01 11:00 |显示全部楼层
Replace line 32
  1. cat "$FNAME"|awk -v B64="$BASE64CODE" '{while(length()){split(substr($0,1,4),a,"");$0=substr($0,5);t=0;for(i=3;i>=0;i--) t=t+2^(6*i)*((a[4-i]=="=")?0:index(B64,a[4-i])-1);for (i=2;i>=0;i--) if (a[4-i]!="="){printf("\\\\\\x%X",t/2^(8*i));t=t%2^(8*i)}}printf"\n"}'|xargs -i printf {}
复制代码
with below line
  1. for raw_data in $(cat "$FNAME"|awk -v B64="$BASE64CODE" '{while(length()){split(substr($0,1,4),a,"");$0=substr($0,5);t=0;for(i=3;i>=0;i--) t=t+2^(6*i)*((a[4-i]=="=")?0:index(B64,a[4-i])-1);for (i=2;i>=0;i--) if (a[4-i]!="="){printf("\\\\\\x%X",t/2^(8*i));t=t%2^(8*i)}}printf"\n"}'); do printf "$raw_data";done
复制代码

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
4 [报告]
发表于 2014-01-01 11:32 |显示全部楼层
That's what I could do now, if you can't manage to make it right I can't neither.

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
5 [报告]
发表于 2014-01-01 14:13 |显示全部楼层
本帖最后由 damcool 于 2014-01-01 14:15 编辑

嗨~!现在的年轻人一点点代码调试能力都没有!刚刚找到电脑,看了一下原来的代码只要去掉xargs后面的-i和{}就可以正常运行了。
  1. cat "$FNAME"|awk -v B64="$BASE64CODE" '{while(length()){split(substr($0,1,4),a,"");$0=substr($0,5);t=0;for(i=3;i>=0;i--) t=t+2^(6*i)*((a[4-i]=="=")?0:index(B64,a[4-i])-1);for (i=2;i>=0;i--) if (a[4-i]!="="){printf("\\\\\\x%X",t/2^(8*i));t=t%2^(8*i)}}printf"\n"}'|xargs printf
复制代码
或者
  1. for raw_data in $(cat "$FNAME"|awk -v B64="$BASE64CODE" '{while(length()){split(substr($0,1,4),a,"");$0=substr($0,5);t=0;for(i=3;i>=0;i--) t=t+2^(6*i)*((a[4-i]=="=")?0:index(B64,a[4-i])-1);for (i=2;i>=0;i--) if (a[4-i]!="="){printf("\\\\x%X",t/2^(8*i));t=t%2^(8*i)}}printf"\n"}'); do printf "$raw_data";done
复制代码

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
6 [报告]
发表于 2014-01-02 08:06 |显示全部楼层
forgaoqiang 发表于 2014-01-01 17:29
function 开头定义函数 这种语法好多shell并不支持吧 ~


如果视力不好,请佩带眼镜观看!

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
7 [报告]
发表于 2014-01-03 09:23 |显示全部楼层
bikkuri 发表于 2014-01-02 13:22
今天抽了点时间来仔细测试一下这个程序,发现解码的部分还是有问题。
我先把原来的代码拆解为编码和解码两 ...


作了些调整,支持管道输入,移除xargs对兼容性的影响

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
8 [报告]
发表于 2014-01-05 08:42 |显示全部楼层
bikkuri 发表于 2014-01-04 15:35
刚才在另外一个盒子上测试发现又出问题了!后来发现这个盒子上的awk不支持^操作:真是太奇怪了,两个盒子的 ...


请善用搜索引擎和自己的大脑。

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
9 [报告]
发表于 2014-01-24 08:12 |显示全部楼层
bikkuri 发表于 2014-01-23 21:36
花了点时间研究,终于看懂了楼主的脚本。
楼主脚本中的解码部分让awk把解码后的字符输出成\x%x的形式再交给 ...


Good Job! That's waht I expected to see.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP