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

TOP

回复 29# plp626


    貌似是我电脑上的内部命令运行太慢...@echo off 效率为 20312.8HZ
"find/?"与"@echo off" 耗时比=1657
"find/?"与"set a=#4647" 耗时比=1281

另:判断是否大/小写时我更喜欢用 delims
  1. set chr=a
  2. for /f "delims=ABCDEFGHIJKLMNOPQRSTUVWXYZ" %%a in ("%chr%") do echo 小写
复制代码

TOP

我的三个方案都很老实,没有什么出彩的地方(而且还内置了你的函数),但还是贴出来吧...

com 方案:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set str= ^^!"$%%&'()*+,-./09:;<=>?@AZ[^_`az|}~
  4. set<nul>$ /p=@!str!
  5. debug asc.com<%0 >nul 2>nul
  6. asc<$>ans.txt
  7. for /f "delims=" %%a in (ans.txt) do set ans=%%a
  8. echo %ans%
  9. pause&exit
  10. e100 B4 08 CD 21 B4 00 BB 64 00 E8 23 00 B3 0A 89 C8
  11. e110 E8 1C 00 88 CA 80 C2 30 CD 21 B2 20 CD 21 B4 0B
  12. e120 CD 21 3C 00 75 DA B4 09 BA 43 01 CD 21 CD 20 F6
  13. e130 F3 88 E1 38 F8 74 0B B7 FF B4 02 88 C2 80 C2 30
  14. e140 CD 21 C3 0D 0A 24
  15. rcx
  16. 46
  17. w
  18. q
复制代码
fc 方案
  1. @echo off
  2. set str=0123_ABCDXYZabcdxyz
  3. setlocal enabledelayedexpansion
  4. set<nul>$ /p"=@!str!"
  5. fc /b $ %comspec%>#
  6. for /f "eol=F skip=2 tokens=2" %%a in (#) do set "ans=!ans!%%a "
  7. echo %ans%
  8. pause
复制代码
纯内部命令方案(0x20~0x7f 范围):
  1. @echo off&setlocal enabledelayedexpansion
  2. set str= ^^!"$%%&'()*+,-./09:;<=>?@AZ[^_`az|}~
  3. set $=!str!#
  4. set N=&for %%z in (4096 2048 1024 512 256 128 64 32 16)do if !$:~%%z!. NEQ . set/aN+=%%z&set $=!$:~%%z!
  5. set $=!$!fedcba9876543210&set/aN+=0x!$:~16,1!-1
  6. set $= ^^!"#$%%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^^_`abcdefghijklmnopqrstuvwxyz{|}~
  7. set "$=                                !$!"
  8. (for /l %%a in (32 1 127) do (
  9.    for /f "delims=" %%b in (":!$:~%%a,1!") do if "!str%%b=!" neq "!str!" echo %%a !$:~%%a,1!
  10. ))>#
  11. set $=
  12. for /l %%a in (0 1 %n%) do (
  13.    for /f "tokens=1,2 delims= " %%b in (#) do (
  14.       if "!str:~%%a,1!"=="%%c" set "ans=!ans!%%b "
  15.    )
  16. )
  17. echo %ans%
  18. pause
复制代码
纯内部命令方案([a-z_A-Z] 范围),结果测试时反而没有前一个方案快:
  1. @echo off
  2. set str=0123_ABCDXYZabcdxyz
  3. setlocal enabledelayedexpansion
  4. set $=!str!
  5. set N=&for %%z in (4096 2048 1024 512 256 128 64 32 16)do if !$:~%%z!. NEQ . set/aN+=%%z&set $=!$:~%%z!
  6. set $=!$!fedcba9876543210&set/aN+=0x!$:~16,1!
  7. set $=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz
  8. (for %%z in ("48 1 57" "65 1 90" "96 1 122") do (
  9.    for /l %%a in (%%~z) do (
  10.       for /f "delims=" %%b in ("!$:~,1!") do (
  11.          if "!str%%b=!" neq "!str!" echo %%a !$:~,1!
  12.          set $=!$:~1!
  13.       )
  14.    )
  15. ))>#
  16. set $=
  17. for /l %%a in (0 1 !n!) do (
  18.    for /f "tokens=1,2 delims= " %%b in (#) do (
  19.       if "!str:~%%a,1!"=="%%c" set "$=!$!%%b "
  20.    )
  21. )
  22. set ans=!$:96=95!
  23. echo %ans%
  24. pause
复制代码
1

评分人数

    • plp626: 辛苦了,PB + 10 技术 + 1

TOP

本帖最后由 plp626 于 2012-3-5 10:42 编辑

回复 30# plp626

:: char2asc 版本2(二分法)每次调用相当于执行20次左右set赋值

    接30楼:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :: 初始化: 定义单字符if顺序表@ifasc; 全局变量 @ifcode
  4. call ascmap.cmd /437 @
  5. set @ifcode=20FF090A0B0C0D2101020304050607080E0F101112131415161718191A1B1C1D1E1F7F272D222324252628292A2C2E2F3A3B3F405B5C5D5E5F607B7C7D7EADA82BF93C3D3EF1AEAFF6FBEFF7F0F3F2A9F4F5FEC4CDB3BADAD5D6C9BFB8B7BBC0D4D3C8D9BEBDBCC3C6C7CCB4B5B6B9C2D1D2CBC1CFD0CAC5D8D7CEDFDCDDDEDBB0B1B29B9C9DAAF8E6FA9E30ACAB3132FD33343536373839EC6141A6A08583848E868F91926242634387806444654582908A888966469F674768486949A18D8C8B6A4A6B4B6C4C6D4D6EFC4EA4A56F4FA7A2959394997050715172527353E174547555A39796819A7656775778587959987A5AE0E2EBEEE9E3E5E4E7EDE8EA
  6. for /l %%a in (0 2 510)do for %%b in ("!@ifcode:~%%a,2!")do set @ifasc=!@ifasc!!@:~0x%%~b,1!
  7. ::char2asc版本2(code by plp) 入口参数#1,出口参数##,需要全局变量@ifasc和@ifcode
  8. set #1=A
  9. set $=!@ifasc!
  10. set n=0&for %%a in (128 64 32 16 8 4 2 1)do if "!#1!" geq "!$:~%%a,1!" set $=!$:~%%a!&set/a n+=%%a*2
  11. set/a ##=0x!@ifcode:~%n%,2!
  12. set ##
  13. pause
复制代码
经比较,28楼char2asc(耗时比2100+),效率略胜二分法版本(耗时比2400+)
1

评分人数

    • CrLf: 应该是最快的办法了吧技术 + 1

TOP

为什么 测试值这么高啊 比用FC搞个临时文件也高好多
  1. :::::::::::::::::::::::::::::::: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
  2. @echo off
  3. set /p var=<%0
  4. setlocal EnableDelayedExpansion
  5. for /l %%i in (32 1 126) do (
  6.    if defined _"!var:~%%i,1!" (
  7.       set "#!var:~%%i,1!=!var:~%%i,1!"
  8.       set "$#!var:~%%i,1!=%%i"
  9.    ) else set _"!var:~%%i,1!"=!var:~%%i,1!&set "$!var:~%%i,1!=%%i"
  10. )
  11. set str= ^^!"$%%&'()*+,-./09:;<=>?@AZ[^^_`az|}~
  12. set "Slen=!str!"
  13. for %%i in (4096 2048 1024 512 256 128 64 32 16)do if "!Slen:~%%i!" NEQ "" set/aLen+=%%i&set Slen=!Slen:~%%i!
  14. set Slen=!Slen!FEDCBA9876543210&set/aLen+=0x!Slen:~16,1!
  15. ECHO !LEN!
  16. for /l %%i in (0 1 !Len!) do (
  17.     for /f "delims=" %%j in ("!str:~%%i,1!") do (
  18.         if "%%j" == "" (set ANS=!ANS! 33)else (
  19.            if "!#%%j!" equ "" (if "!$%%j!" equ "" (set ANS=!ANS! 61)else set ANS=!ANS! !$%%j!) else (
  20.               if "!#%%j!" lss "%%j" (set ANS=!ANS! !$%%j!) else set ANS=!ANS! !$#%%j!
  21.            )
  22.         )
  23.     )
  24. )
  25. echo!ANS!
  26. pause
复制代码

TOP

回复 35# terse


显然,这说明预处理耗时随代码长度的增长不是线性增长的,看来代码简短是保证效率高的一个要求。。。

TOP

本帖最后由 terse 于 2012-3-5 18:48 编辑

怪不得 测试值这么高 原来没清空Len变量 我就说 从代码流程来说不应该这么高撒 现在测试值我这里700多

另:CrLf版主的 FC 方案 省去临时文件?
1

评分人数

TOP

本帖最后由 plp626 于 2012-3-5 21:11 编辑

那个win7运行下,看看结果,我这里比值是terse的快两倍了,rate=1300+
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :: 获得100000次执行 @echo off 任务的耗时,存放在ct1变量内
  4. set t1=%time%
  5. for /l %%a in (1 1 100000)do @echo off
  6. set t2=%time%
  7. call:etime t1 t2 tc1
  8. :: 初始工作(该处可省略),比如定义一些变量等,以便后面高效执行你的代码
  9. call ascmap.cmd @
  10. set @=!@:~1,127!
  11. ::获取256查表法#ff表
  12. set $f= 0 1 2 3 4 5 6 7 8 9 a b c d e f&set #ff=&for %%a in (!$F!)do set #ff=!#ff!!$f: =%%a!
  13. :: 获得500次执行“你的代码”任务的耗时,存放在ct2变量内
  14. set t1=%time%
  15. for /l %%? in (1 1 500)do (
  16.     set str= ^^!"$%%&'()*+,-./09:;<=>?@AZ[^_`az|}~
  17. rem /***************** 字符范围0x01~0x7f ***********************
  18.     set ans=
  19.     for /l %%A in (0 1 33)do (
  20.         set #1=!str:~%%A,1!
  21.         set $1=
  22.         for /f "delims=%@:~97,26%" %%a in (":!#1!")do if %%a==: set $1=32
  23.         if !#1!==!@:~9^,1! (
  24.             set ##=10
  25.         )else if !#1!==^= (
  26.             set ##=61
  27.         )else if !#1!==^^! (
  28.             set ##=33
  29.         )else for /f "eol=!delims=" %%b in ("!#1!")do (
  30.             set ##=!#ff!!@:*%%b=!!@:*%%b=!&set/a##=128-0x!##:~-510,2!+$1
  31.         )
  32.         set ans=!ans! !##!
  33.     )
  34. rem *******************************************************/
  35.     echo !ans!
  36. )
  37. set t2=%time%
  38. call:etime t1 t2 tc2
  39. :: 计算执行一次“你的代码”与执行一次“@echo off”的耗时比
  40. set/a rate=200*tc2/tc1
  41. set rate
  42. pause
  43. :etime <begin> <end> <ret> //求时差
  44. setlocal enabledelayedexpansion
  45. 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)"
  46. endlocal&set %3=%c%&goto:eof
复制代码

TOP

回复 37# terse


    terse 能否发下你的700+的测试源代码?

TOP

  1. :::::::::::::::::::::::::::::::: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
  2. @echo off
  3. set /p var=<%0
  4. :: 获得100000次执行 @echo off 任务的耗时,存放在ct1变量内
  5. set t1=%time%
  6. for /l %%a in (1 1 100000)do @echo off
  7. set t2=%time%
  8. call:etime t1 t2 tc1
  9. setlocal enabledelayedexpansion
  10. for /l %%i in (32 1 126) do (
  11.    if defined _"!var:~%%i,1!" (
  12.       set "#!var:~%%i,1!=!var:~%%i,1!"
  13.       set "$#!var:~%%i,1!=%%i"
  14.    ) else set _"!var:~%%i,1!"=!var:~%%i,1!&set "$!var:~%%i,1!=%%i"
  15. )
  16. :: 获得500次执行“你的代码”任务的耗时,存放在ct2变量内
  17. set t1=%time%
  18. for /l %%a in (1 1 500)do (
  19. set str= ^^!"$%%&'()*+,-./09:;<=>?@AZ[^^_`az|}~
  20. set Len=0&set "Slen=!str!"
  21. for %%i in (4096 2048 1024 512 256 128 64 32 16)do if "!Slen:~%%i!" NEQ "" set/aLen+=%%i&set Slen=!Slen:~%%i!
  22. set Slen=!Slen!FEDCBA9876543210&set/aLen+=0x!Slen:~16,1!
  23. for /l %%i in (0 1 !Len!) do (
  24.     for /f "delims=" %%j in ("!str:~%%i,1!") do (
  25.         if "%%j" neq "" (
  26.            if "!#%%j!" neq "" (
  27.               if "!#%%j!" lss "%%j" (set Ans=!Ans! !$%%j!) else set Ans=!Ans! !$#%%j!
  28.            ) else if "!$%%j!" neq "" (set Ans=!Ans! !$%%j!)else set Ans=!Ans! 61
  29.         ) else set Ans=!Ans! 33
  30.     )
  31. )
  32. echo!Ans!&set Ans=
  33. )
  34. set t2=%time%
  35. call:etime t1 t2 tc2
  36. :: 计算执行一次“你的代码”与执行一次“@echo off”的耗时比
  37. set/a rate=200*tc2/tc1
  38. echo 一次任务与一次“@echo off命令”耗时比=%rate%
  39. pause
  40. :etime <begin> <end> <ret> //求时差
  41. setlocal enabledelayedexpansion
  42. 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)"
  43. endlocal&set %3=%c%&goto:eof
  44. :: 某些标签子过程,(该处可省略)
  45. :label
  46. rem ....
复制代码
3

评分人数

    • neorobin: THANKS技术 + 1
    • CrLf: 看来我对变量索引的偏见太深了...PB + 10 技术 + 1
    • plp626: 我的xp效率比900+;最终变量法最快速技术 + 1

TOP

回复 39# plp626
测试代码取自一楼的 是如上面如此嵌入吗

TOP

回复 41# terse

是的;

看你的代码研究差别;发现定义100个变量值为单字符的变量和定义1个变量值为200个字符的变量;对set的影响差不多;

看来我低估了定义变量索引的思路。。

TOP

本帖最后由 CrLf 于 2012-3-6 18:21 编辑

回复 40# terse


    一直以来都极力避免使用变量索引表(生命游戏后遗症),不过看来是成见太深了...没想到,此处使用索引表所简化的流程用时竟足以弥补冗长的变量表所降低的效率。
    另:不知你在 37 楼提到的 “FC 方案 省去临时文件” 是指什么呢?如果是指可以写成 for /f "tokens=2" %%a in ('fc ...') do ... 的话,那么可以测试一下,理论上的用时会将会翻倍,因为 for /? 中提到,在 for /f  里从命令获取输出时, “该字符串会被当作命令行,传递到一个子 CMD.EXE,其输出会被捕获到内存中,并被当作文件分析。”


回复 42# plp626


    先清空变量环境再测试,这 4n:2n+3  的差异应该就会凸显出来(假设为变量名为单字符),而且在只以第一个等号为依据判断变量名的 xp 系统下估计会体现得更明显

TOP

回复 43# CrLf
我的意思是 假如临时文件$大于 CMD 应该出错的哦  当然此案另外

TOP

回复 44# terse


    因为楼主要求将保存为一行,所以不考虑超过变量上限的 hex 长度
如果要兼容大文件转 hex,那就加点料...
  1. @echo off
  2. copy /y /b %0+要测试的文件  tmp.tmp
  3. fc /b 要测试的文件 tmp.tmp>#
  4. setlocal enabledelayedexpansion
  5. for /f "eol=F skip=2 tokens=2" %%a in (#) do echo %%a
  6. pause
复制代码

TOP

返回列表