免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345
最近访问板块 发新帖
楼主: 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
41 [报告]
发表于 2013-12-31 10:10 |只看该作者
本帖最后由 bikkuri 于 2013-12-31 10:51 编辑

我的程序的第53行到第64行不就是处理最后不足三字节的情况吗?
  1. root@unknown:/tmp/test# cat a.gz |hexdump -ve '/1 "%02x "'|./base64encode.sh
  2. byte1=31 byte2=139 byte3=8 i=1 NF=26
  3. base1=7 base2=56 base3=44 base4=8
  4. Result=H4sI
  5. byte1=0 byte2=12 byte3=156 i=4 NF=26
  6. base1=0 base2=0 base3=50 base4=28
  7. Result=H4sIAAyc
  8. byte1=194 byte2=82 byte3=2 i=7 NF=26
  9. base1=48 base2=37 base3=8 base4=2
  10. Result=H4sIAAycwlIC
  11. byte1=3 byte2=243 byte3=72 i=10 NF=26
  12. base1=0 base2=63 base3=13 base4=8
  13. Result=H4sIAAycwlICA/NI
  14. byte1=205 byte2=201 byte3=201 i=13 NF=26
  15. base1=51 base2=28 base3=39 base4=9
  16. Result=H4sIAAycwlICA/NIzcnJ
  17. byte1=231 byte2=2 byte3=0 i=16 NF=26
  18. base1=57 base2=48 base3=8 base4=0
  19. Result=H4sIAAycwlICA/NIzcnJ5wIA
  20. byte1=22 byte2=53 byte3=150 i=19 NF=26
  21. base1=5 base2=35 base3=22 base4=22
  22. Result=H4sIAAycwlICA/NIzcnJ5wIAFjWW
  23. byte1=49 byte2=6 byte3=0 i=22 NF=26
  24. base1=12 base2=16 base3=24 base4=0
  25. Result=H4sIAAycwlICA/NIzcnJ5wIAFjWWMQYA
  26. byte1=0 byte2=0 byte3=0 i=25 NF=26
  27. base1=0 base2=0 base3=0 base4=0
  28. Result=H4sIAAycwlICA/NIzcnJ5wIAFjWWMQYAAA==
  29. H4sIAAycwlICA/NIzcnJ5wIAFjWWMQYAAA==root@unknown:/tmp/test#
复制代码
damcool 发表于 2013-12-31 08:18
一个问题按照RFC要求base64encode需要每76字符换行,少最后4个字符,我觉得你没有处理不足三字节的情况 ...

论坛徽章:
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
42 [报告]
发表于 2013-12-31 10:13 |只看该作者
本帖最后由 bikkuri 于 2013-12-31 10:53 编辑

膜拜啊大神!
damcool大神能否请您移步:http://bbs.chinaunix.net/thread-4115796-1-3.html
看一下我写的另外一个在busybox下的base64解码程序。
虽然现在工作正常,但是总感觉不放心,最后为了保证解码正确采用延时的手段是正确的吗?
再次感谢您的帮助!

Herowinter 发表于 2013-12-31 09:30
回复 39# damcool
精通规范的业内人士来了,咱们这种背景不熟
的遇到救星了。

论坛徽章:
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
43 [报告]
发表于 2013-12-31 10:25 |只看该作者
回复 42# bikkuri
能帮上忙就好了,大神缪赞了。
在解码那个贴里,你试过
24楼yinyuemi大大的代码吗?

   

论坛徽章:
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
44 [报告]
发表于 2013-12-31 10:52 |只看该作者
试过,但是在busybox下不能正常工作。

回复 43# Herowinter


   

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
45 [报告]
发表于 2013-12-31 10:53 |只看该作者
bikkuri 发表于 2013-12-31 10:10
我的程序的第53行到第64行不就是处理最后不足三字节的情况吗?

抱歉,我可能看的不够细,AA==应该是最后的0,类似于EOF标志。可能你在读文件时没有解析。应该不是问题。

论坛徽章:
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
46 [报告]
发表于 2013-12-31 11:03 |只看该作者
我检查了一下输入,发现两个程序的输入虽然有十进制和十六进制的区别,但是字节数是一样的:
  1. root@unknown:/tmp/test# cat a.gz |hexdump -ve '/1 "%02x "'
  2. 1f 8b 08 00 0c 9c c2 52 02 03 f3 48 cd c9 c9 e7 02 00 16 35 96 31 06 00 00 00 root@unknown:/tmp/test#
  3. root@unknown:/tmp/test# cat a.gz|hexdump -ve '1/1 "%d "'
  4. 31 139 8 0 12 156 194 82 2 3 243 72 205 201 201 231 2 0 22 53 150 49 6 0 0 0 root@unknown:/tmp/test#
复制代码
damcool 发表于 2013-12-31 10:53
抱歉,我可能看的不够细,AA==应该是最后的0,类似于EOF标志。可能你在读文件时没有解析。应该不是问题。

论坛徽章:
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
47 [报告]
发表于 2013-12-31 11:17 |只看该作者
回复 44# bikkuri
这个不是很懂啦,个人感觉你的猜测可能是对的,
你也可以试一下system需不需要延时
  1. awk '{cmd="printf \"%c\" \"\" ";system(cmd)}'
复制代码

论坛徽章:
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
48 [报告]
发表于 2013-12-31 11:36 |只看该作者
输入没有问题,只能是程序的问题,我仔细看了一下对最后不足3字节的处理,发现我的程序错了。
比如在最后i=25, NF=26的时候,还剩最后的第25和第26字节,输出应该只有一个=,
但在程序中NF-i=1,我错当成只剩最后一个字节,所以输出了两个=。
正确的处理应该是:
  1.                 if (NF-i==0){
  2.                         result=result substr(BASE64,base1+1,1);
  3.                         result=result substr(BASE64,base2+1,1);
  4.                         result=result "==";
  5.                 }

  6.                 if (NF-i==1){
  7.                         result=result substr(BASE64,base1+1,1);
  8.                         result=result substr(BASE64,base2+1,1);
  9.                         result=result substr(BASE64,base3+1,1);
  10.                         result=result "=";
  11.                 }

  12.                 if (NF-i>=2){
  13.                         result=result substr(BASE64,base1+1,1);
  14.                         result=result substr(BASE64,base2+1,1);
  15.                         result=result substr(BASE64,base3+1,1);
  16.                         result=result substr(BASE64,base4+1,1);
  17.                 }
复制代码
这次输出的结果就和damcool大神一样了!
  1. root@unknown:/tmp/test# cat a.gz|hexdump -ve '1/1 "%d "'|./base64encode.sh
  2. byte1=49 byte2=313 byte3=8 i=1 NF=26
  3. base1=12 base2=19 base3=36 base4=8
  4. Result=MTkI
  5. byte1=0 byte2=18 byte3=342 i=4 NF=26
  6. base1=0 base2=1 base3=9 base4=22
  7. Result=MTkIABJW
  8. byte1=404 byte2=130 byte3=2 i=7 NF=26
  9. base1=101 base2=8 base3=8 base4=2
  10. Result=MTkIABJWIIC
  11. byte1=3 byte2=579 byte3=114 i=10 NF=26
  12. base1=0 base2=52 base3=13 base4=50
  13. Result=MTkIABJWIICA0Ny
  14. byte1=517 byte2=513 byte3=513 i=13 NF=26
  15. base1=129 base2=16 base3=4 base4=1
  16. Result=MTkIABJWIICA0NyQEB
  17. byte1=561 byte2=2 byte3=0 i=16 NF=26
  18. base1=140 base2=16 base3=8 base4=0
  19. Result=MTkIABJWIICA0NyQEBQIA
  20. byte1=34 byte2=83 byte3=336 i=19 NF=26
  21. base1=8 base2=37 base3=13 base4=16
  22. Result=MTkIABJWIICA0NyQEBQIAIlNQ
  23. byte1=73 byte2=6 byte3=0 i=22 NF=26
  24. base1=18 base2=16 base3=24 base4=0
  25. Result=MTkIABJWIICA0NyQEBQIAIlNQSQYA
  26. byte1=0 byte2=0 byte3=0 i=25 NF=26
  27. base1=0 base2=0 base3=0 base4=0
  28. Result=MTkIABJWIICA0NyQEBQIAIlNQSQYAAAA=
  29. MTkIABJWIICA0NyQEBQIAIlNQSQYAAAA=root@unknown:/tmp/test#
复制代码
bikkuri 发表于 2013-12-31 11:03
我检查了一下输入,发现两个程序的输入虽然有十进制和十六进制的区别,但是字节数是一样的:

论坛徽章:
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
49 [报告]
发表于 2013-12-31 14:14 |只看该作者
本帖最后由 bikkuri 于 2013-12-31 14:23 编辑

这个试过了的,但是busybox下的awk不支持system,所以24楼yinyuemi的代码在busybox下也不行。
  1. root@unknown:/tmp/test# awk 'BEGIN{cmd="echo Hello";system(cmd)}'
  2. root@unknown:/tmp/test# awk 'BEGIN{cmd="echo Hello";cmd;close(cmd)}'
  3. root@unknown:/tmp/test# awk 'BEGIN{cmd="echo Hello"; print cmd | "/bin/sh" ;}'
  4. Hello
  5. root@unknown:/tmp/test#
复制代码
Herowinter 发表于 2013-12-31 11:17
回复 44# bikkuri
这个不是很懂啦,个人感觉你的猜测可能是对的,
你也可以试一下system需不需要延时
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP