亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
123下一頁
最近訪問板塊 發(fā)新帖
查看: 10913 | 回復(fù): 26
打印 上一主題 下一主題

[文本處理] BASH版本的base64 [復(fù)制鏈接]

論壇徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龍
日期:2014-09-07 07:46:06
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-12-31 22:59 |只看該作者 |倒序?yàn)g覽
本帖最后由 damcool 于 2014-01-03 09:22 編輯

AWK版本的base64編解碼腳本有很多限制,特別是在busybox下,作為新年禮物寫了一些BASH版本的。如果busybox有hexdump的話。基本上沒什么問題了。速度還可以吧。
更新說明
1、去除xargs對(duì)腳本兼容性影響
2、加入對(duì)管道輸入的支持
  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
復(fù)制代碼

論壇徽章:
18
辰龍
日期:2014-05-21 21:01:4115-16賽季CBA聯(lián)賽之深圳
日期:2016-12-23 13:51:3815-16賽季CBA聯(lián)賽之北控
日期:2016-11-28 18:26:3815-16賽季CBA聯(lián)賽之佛山
日期:2016-11-03 11:18:5815-16賽季CBA聯(lián)賽之遼寧
日期:2016-07-10 16:09:4115-16賽季CBA聯(lián)賽之江蘇
日期:2016-02-20 23:09:202015亞冠之塔什干棉農(nóng)
日期: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
2 [報(bào)告]
發(fā)表于 2014-01-01 02:12 |只看該作者
本帖最后由 bikkuri 于 2014-01-01 03:01 編輯

膜拜了!之前我用awk寫的base64編碼和解碼程序確實(shí)效率很低,在CPU 200MHz的Busybox上編碼或者解碼一個(gè)大約4000字節(jié)的二進(jìn)制文件需要大約一分鐘時(shí)間。
說實(shí)話,對(duì)您的腳本中的awk的部分我看得還不是很懂,需要時(shí)間消化。
對(duì)您的腳本我有三個(gè)問題:
1、貌似function help_usage(){ 這樣定義函數(shù)的方式是awk,在shell下應(yīng)該去掉function;
2、編碼的部分我在busybox下測試了沒有問題,但是解碼的部分在busybox下測試報(bào)錯(cuò)而且解碼文件比原文件還要大:
  1. root@unknown:/tmp/test# ./base64.sh -d a.64 > b.gz
  2. xargs: illegal option -- i
  3. root@unknown:/tmp/test# ls -l
  4. -rw-r--r--    1 root     root            36 Jan  1 02:01 a.64
  5. -rw-r--r--    1 root     root            26 Jan  1 02:01 a.gz
  6. -rw-r--r--    1 root     root            48 Jan  1 02:31 b.gz
  7. -rwxr-xr-x    1 root     root          2183 Jan  1 02:29 base64.sh
  8. root@unknown:/tmp/test# more b.gz
  9. SDRzSUFPZDJ3MUlDQS9OSXpjbko1d0lBRmpXV01RWUFBQUE9root@unknown:/tmp/test#
復(fù)制代碼
3、解碼時(shí)在busybox下awk無法輸出NULL字符,不知道您是怎么解決的?

論壇徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龍
日期:2014-09-07 07:46:06
3 [報(bào)告]
發(fā)表于 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 !

論壇徽章:
18
辰龍
日期:2014-05-21 21:01:4115-16賽季CBA聯(lián)賽之深圳
日期:2016-12-23 13:51:3815-16賽季CBA聯(lián)賽之北控
日期:2016-11-28 18:26:3815-16賽季CBA聯(lián)賽之佛山
日期:2016-11-03 11:18:5815-16賽季CBA聯(lián)賽之遼寧
日期:2016-07-10 16:09:4115-16賽季CBA聯(lián)賽之江蘇
日期:2016-02-20 23:09:202015亞冠之塔什干棉農(nóng)
日期: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
4 [報(bào)告]
發(fā)表于 2014-01-01 10:46 |只看該作者
I found the xargs information in busybox as below:
  1. xargs
  2. xargs [OPTIONS] [PROG [ARGS]]
  3. Run PROG on every item given by standard input
  4. Options:
  5. -p Ask user whether to run each command
  6. -r Do not run command if input is empty
  7. -0 Input is separated by NUL characters
  8. -t Print the command on stderr before execution
  9. -e[STR] STR stops input processing
  10. -n N Pass no more than N args to PROG
  11. -s N Pass command line of no more than N bytes
  12. -x Exit if size is exceeded
復(fù)制代碼
which option should I use to replace the -i option?

damcool 發(fā)表于 2014-01-01 10:22
1.Please forget the AWK solution at all
2.Check out the xargs usage in busybox & adjust the decode  ...

論壇徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龍
日期:2014-09-07 07:46:06
5 [報(bào)告]
發(fā)表于 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 {}
復(fù)制代碼
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
復(fù)制代碼

論壇徽章:
18
辰龍
日期:2014-05-21 21:01:4115-16賽季CBA聯(lián)賽之深圳
日期:2016-12-23 13:51:3815-16賽季CBA聯(lián)賽之北控
日期:2016-11-28 18:26:3815-16賽季CBA聯(lián)賽之佛山
日期:2016-11-03 11:18:5815-16賽季CBA聯(lián)賽之遼寧
日期:2016-07-10 16:09:4115-16賽季CBA聯(lián)賽之江蘇
日期:2016-02-20 23:09:202015亞冠之塔什干棉農(nóng)
日期: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
6 [報(bào)告]
發(fā)表于 2014-01-01 11:13 |只看該作者
After I replaced the line with the new one.
The decode output is double as it should be.
  1. root@unknown:/tmp/test# echo "Hello" > a
  2. root@unknown:/tmp/test# gzip a
  3. root@unknown:/tmp/test# ./base64_encode_decode.sh a.gz > a.64
  4. root@unknown:/tmp/test# ./base64_encode_decode.sh -d a.64 > b.gz
  5. root@unknown:/tmp/test# ls -l
  6. -rw-r--r--    1 root     root            36 Jan  1 11:12 a.64
  7. -rw-r--r--    1 root     root            26 Jan  1 11:12 a.gz
  8. -rw-r--r--    1 root     root            52 Jan  1 11:12 b.gz
  9. -rwxr-xr-x    1 root     root          2197 Jan  1 11:10 base64_encode_decode.sh
  10. root@unknown:/tmp/test#
復(fù)制代碼
damcool 發(fā)表于 2014-01-01 11:00
Replace line 32with below line

論壇徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龍
日期:2014-09-07 07:46:06
7 [報(bào)告]
發(fā)表于 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.

論壇徽章:
18
辰龍
日期:2014-05-21 21:01:4115-16賽季CBA聯(lián)賽之深圳
日期:2016-12-23 13:51:3815-16賽季CBA聯(lián)賽之北控
日期:2016-11-28 18:26:3815-16賽季CBA聯(lián)賽之佛山
日期:2016-11-03 11:18:5815-16賽季CBA聯(lián)賽之遼寧
日期:2016-07-10 16:09:4115-16賽季CBA聯(lián)賽之江蘇
日期:2016-02-20 23:09:202015亞冠之塔什干棉農(nóng)
日期: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
8 [報(bào)告]
發(fā)表于 2014-01-01 12:04 |只看該作者
I tested the script on Linux also.
With the xargs line, the decode output is correct, but with the replaced line, the decode output is incorrect.
So the problem is with the replaced line...

damcool 發(fā)表于 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
9 [報(bào)告]
發(fā)表于 2014-01-01 14:13 |只看該作者
本帖最后由 damcool 于 2014-01-01 14:15 編輯

嗨~!現(xiàn)在的年輕人一點(diǎn)點(diǎn)代碼調(diào)試能力都沒有!剛剛找到電腦,看了一下原來的代碼只要去掉xargs后面的-i和{}就可以正常運(yùn)行了。
  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
復(fù)制代碼
或者
  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
復(fù)制代碼

論壇徽章:
18
辰龍
日期:2014-05-21 21:01:4115-16賽季CBA聯(lián)賽之深圳
日期:2016-12-23 13:51:3815-16賽季CBA聯(lián)賽之北控
日期:2016-11-28 18:26:3815-16賽季CBA聯(lián)賽之佛山
日期:2016-11-03 11:18:5815-16賽季CBA聯(lián)賽之遼寧
日期:2016-07-10 16:09:4115-16賽季CBA聯(lián)賽之江蘇
日期:2016-02-20 23:09:202015亞冠之塔什干棉農(nóng)
日期: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
10 [報(bào)告]
發(fā)表于 2014-01-01 15:40 |只看該作者
剛才測試了一下,確實(shí)可以正常輸出了!
謝謝您的指點(diǎn)!
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP