Board logo

标题: 【出题】批处理打印所有ASCII字符 [打印本页]

作者: plp626    时间: 2011-6-9 18:57     标题: 【出题】批处理打印所有ASCII字符

本帖最后由 plp626 于 2011-6-16 18:38 编辑

这道题的解答,对新手需要熟练掌握的for变量延迟处理
对老鸟,需要熟练掌握变量的多级访问技巧,还需要熟练排序算法
实乃新手进阶,老鸟练功 的首选试题!



调用ascmap.cmd文件(在这里下载http://www.bathome.net/thread-12347-1-1.html

打印所有ascii码字符,打印格式如下,要对齐显示
  1.   0 0x00 <NUL>   |  32  0x20 <space>   |  64  0x40 @       |  96  0x60 `
  2.   1 0x01        |  33  0x21 !         |  65  0x41 A       |  97  0x61 a
  3. ...                    ...
  4. 128 0x80         | 160 0xA0  ....
  5. ...
复制代码
cmd下不可显示的字符有0x00 0x07 0x08 0x09 0x0a 0x0d 0x20
打印的时候分别用<NUL> <BELL>  <BS>  <TAB> <LF> <CR> <SPACE>代替

PS: 分栏的时候,竖杠用ASCII 0xb3 表示更好看些

新手,老鸟,欢迎参与;
==============
对于老鸟,增加下难度:
除了打印出ascii表外,按照if 命令单字符的比较顺序
把0x00~0xff的所有字符也打印出来,打印格式相同(把0x00字符放在第一个)
作者: CrLf    时间: 2011-6-9 19:41

看起来比较难的样子
前阵子没有关注过那几个特定帖子的人,估计对这题无从下手吧,要不要把链接给...
作者: plp626    时间: 2011-6-9 20:15

本帖最后由 plp626 于 2011-6-11 16:12 编辑

2# zm900612


不需要,只要下载了ascmap.cmd文件到windows目录下使用很傻瓜的:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. chcp 437
  4. call ascmap $
  5. echo !$:~0x01,1! !$:~0x09,1! !$:~0x30,1! !$:~0x09,1! !$:~0x80,1!
  6. pause
复制代码

作者: qzwqzw    时间: 2011-6-9 21:37

规定的打印形式比较怪异
为什么只分两栏?
贴一个近似的
以10进制码值计算偏移
应该也可以以16进制码值计算偏移
  1. :: ASCPrint.cmd - 按照特定形式打印ASCII字符集 - qzwqzw
  2. @echo off & setlocal EnableDelayedExpansion & chcp 437 & cls
  3. call ascmap.cmd ascmap
  4. for /l %%i in (1,1,255) do set "$%%i=!ascmap:~%%i,1!"
  5. set values="$0=<NUL>" "$7=<BELL>" "$8=<BS>" "$9=<TAB>" "$10=<LF>" "$13=<CR>" "$32=<SPACE>"
  6. for %%v in (%values%) do set %%v
  7. for /l %%i in (0,1,3) do (
  8. for /l %%j in (0,1,31) do (
  9. set /a n1=%%i*64+%%j,n2=%%i*64+32+%%j
  10. cmd /c exit /b !n1!
  11. set "no1=  !n1! !=ExitCode:~-2!"
  12. for %%i in (!n1!) do set "ch1=!$%%i!       "
  13. cmd /c exit /b !n2!
  14. set "no2=  !n2! !=ExitCode:~-2!"
  15. for %%i in (!n2!) do set "ch2=!$%%i!       "
  16. echo !no1:~-6! !ch1:~0,7!  ^|  !no2:~-6! !ch2:~0,7!
  17. )
  18. echo.
  19. )
复制代码

作者: qzwqzw    时间: 2011-6-9 22:27

本帖最后由 qzwqzw 于 2011-6-9 22:30 编辑

更换为以16进制码值为单位打印的
同时根据楼主的要求改换为4栏打印
再进一步比较大小没有时间完成了
有兴趣的可以继续
  1. :: ASCPrint.cmd - 按照特定形式打印ASCII字符集 - qzwqzw
  2. @echo %debug% off & setlocal EnableDelayedExpansion & chcp 437 & cls
  3. call ascmap.cmd ascmap
  4. for /l %%i in (1,1,255) do set "$%%i=!ascmap:~%%i,1!"
  5. set values="$0=<NUL>" "$7=<BELL>" "$8=<BS>" "$9=<TAB>" "$10=<LF>" "$13=<CR>" "$32=<SPACE>"
  6. for %%v in (%values%) do set %%v
  7. for %%s in ("0-2-4-6 1-3-5-7" "8-A-C-E 9-B-D-F") do (
  8.     for %%t in (%%~s) do (
  9.         for %%i in (0 1 2 3 4 5 6 7 8 9 A B C D E F) do (
  10.             for /f "tokens=1-4 delims=-" %%a in ("%%t") do (
  11.                 set values="h1=%%a%%i" "h2=%%b%%i" "h3=%%c%%i" "h4=%%d%%i"
  12.                 for %%v in (!values!) do set %%v
  13.                 for %%j in (1 2 3 4) do (
  14.                     set /a d%%j=0x!h%%j!
  15.                     set "n%%j=  !d%%j!"
  16.                     for %%v in ($!d%%j!) do set "ch%%j=!%%v!       "
  17.                     set out%%j=!n%%j:~-3! 0x!h%%j! !ch%%j:~0,7!
  18.                 )
  19.                 echo  !out1! %$179% !out2! %$179% !out3! %$179% !out4!
  20.             )
  21.         )
  22.     )
  23.     echo.
  24. )
  25. if "%~0"=="%~f0" pause
复制代码

作者: lllsoslll    时间: 2011-6-16 18:18

按if命令的判断顺序,格式输出,不简单,涉及到变量三级指针访问,顶起来。

思考中。。。




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2