[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【擂台赛】将字符串转换为ascii值的高效代码 -- 批处理完成

本帖最后由 plp626 于 2012-3-2 02:13 编辑

问题背景:密码存储的问题,以及编码存储的问题产生的。。。
该问题自己完成顿觉吃力,且不甚满意,故放在论坛,求助众人智慧
  1. :: 版本一,支持字母,数字,下划线
  2. set str=0123_ABCDXYZabcdxyz
  3. rem 代码?
  4. echo %ans%
复制代码
则输出48 49 50 51 95 65 66 67 68 88 89 90 97 98 99 100 120 121 122
  1. :: 版本二,支持尽量多的字符(0x20~0x7f)
  2. setlocal enabledelayedexpansion
  3. set str= ^^!"$%%&'()*+,-./09:;<=>?@AZ[^_`az|}~
  4. rem 代码?
  5. echo %ans%
复制代码
则输出32 33 34 36 37 38 39 40 41 42 43 44 45 46 47 48 57 58 59 60 61 62 63 64 65 90 91 95 96 97 122 124 125 126
------------------------------------------------------------------
为方便比较:
测试代码以执行一次@echo off为参照,计算代码耗时比值,从而大略消除因为各人系统配置不同而带来的耗时比较问题

代码要求
没有要求,
尽管可以掉三方,外部命令,只要能在循环体内很节省时间地调用(就只怕得不偿失)
为方便统一比较效率,强烈建议使用统一测试代码;

测试代码如下:
  1. @echo off
  2. :: 获得100000次执行 @echo off 任务的耗时,存放在ct1变量内
  3. set t1=%time%
  4. for /l %%a in (1 1 100000)do @echo off
  5. set t2=%time%
  6. call:etime t1 t2 tc1
  7. :: 初始工作(该处可省略),比如定义一些变量等,以便后面高效执行你的代码
  8. rem 。。。。
  9. :: 获得500次执行“你的代码”任务的耗时,存放在ct2变量内
  10. set t1=%time%
  11. for /l %%a in (1 1 500)do (
  12.     set str=0123_ABCDXYZabcdxyz
  13.     rem 版本一代码(或者版本二代码,但相应的str值请更换)
  14.    echo %ans%
  15. )
  16. set t2=%time%
  17. call:etime t1 t2 tc2
  18. :: 计算执行一次“你的代码”与执行一次“@echo off”的耗时比
  19. set/a rate=200*tc2/tc1
  20. echo 一次任务与一次“@echo off命令”耗时比=%rate%
  21. pause
  22. :etime <begin> <end> <ret> //求时差
  23. setlocal enabledelayedexpansion
  24. Set/a "c=(!%2:~,2!-!%1:~,2!)*360000+(1!%2:~3,2!-1!%1:~3,2!)*6000+1!%2:~-5,2!!%2:~-2!-1!%1:~-5,2!!%1:~-2!,c+=-8640000*(c>>31)"
  25. endlocal&set %3=%c%&goto:eof
  26. :: 某些标签子过程,(该处可省略)
  27. :label
  28. rem ....
复制代码
建议大家先别贴自己代码,先贴代码运行后的比值
请连续运行3次以上,多次求平均值以减小误差(比值越小自然代码效率越高),最后再亮代码,这样很有意思(代码别太长)

批处理字符编码(密码加密)工具
http://www.bathome.net/thread-15659-1-1.html
虽然不同,但也差不多。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

为什么我会vbs,知道vbs就不想在bat上深挖了。。。

TOP

恩;
我想会有人在bat版问:vbs一行代码的事情为什么要多行去做?
答案在风中。。。

TOP

ASCII字符集以外的字符用纯bat好像没办法吧。

TOP

测试的字符串已经给范围了
^!"$%&'()*+,-./09:;<=>?@AZ[^_`az|}~

能处理这些就OK了

TOP

本帖最后由 lllsoslll 于 2012-3-2 02:36 编辑

我的 version 1.0
  1. set str=0123_ABCDXYZabcdxyz
  2. rem 版本一代码
复制代码
测试代码运行结果:
一次任务与一次“@echo off命令”耗时比=6219

继续优化。。
我的 version 1.1
  1. set str=0123_ABCDXYZabcdxyz
  2. rem 版本一代码
复制代码
测试代码运行结果:
一次任务与一次“@echo off命令”耗时比=5756
SOS --- >> lllsoslll@163.com

TOP

版本二:
一次任务与一次“@echo off命令”耗时比=1571
一次任务与一次“@echo off命令”耗时比=1463
用了外部命令...

TOP

个人感觉纯内部命令方案的循环量太大,无法用变量替换简化,而且受所需兼容的范围影响太严重,故而没打算往那个方向去考虑。

换了一个方案,只用一个外部命令,不过结果反而更慢了...
\w范围:
一次任务与一次“@echo off命令”耗时比=2944
可打印字符范围:
一次任务与一次“@echo off命令”耗时比=3094

TOP

我不是来唱反调的,我就是想问一下研究是不是要和实用性挂上钩才是王道?
***共同提高***

TOP

用 VBS+BAT?

TOP

第一想到 VBS + BAT
纯P的效率不够撒

TOP

目前我只想到逐字查表法,将=和!之外的字符定义成变量,=和!单独处理。
1

评分人数

TOP

看来我的代码效率好低,是8楼的1/3
SOS --- >> lllsoslll@163.com

TOP

回复 13# powerbat


    嗯,这应该是类似情况下循环量较小的方案,当其他所有字符都被处理为数字后,! 可以用 %str:!=33% 直接替换,而等号可以利用预处理替换为空格再替换为 61,但是虽然避免了大量的循环,定义大量变量带来的效率损失也同样是很恐怖的...


回复 14# lllsoslll


    我的方案虽然看起来效率比较高,但没有算法可言...而且按楼主给出的格式计算 echo off 与代码的效率比值在不同电脑上似乎结果不同(有趣的是,方案一是2900+,方案二的值是1400+,把之前另一台机子的结果颠倒了)

TOP

返回列表