Board logo

标题: [原创]CMD批处理获取文件的ASCII码 [打印本页]

作者: lxmxn     时间: 2007-1-10 13:13    标题: [原创]CMD批处理获取文件的ASCII码


  利用FC命令的“执行二进制比较”参数/B来获取文件的ASCII码,并分别显示其ASCII的十六进制和十进制形式,理论上可以是获取任何文件的内容所对应的ASCII码。

  说明:如果文件中含有中文或者ASCII码值比较大的字符,显示的ASCII码就会分开了,这是不可避免的。比如"啊"将显示为"B0 A1",因此其对应的十进制形式就会显示为"176 161"。
  希望大家多测试一下,有bug或者错误的地方,请跟贴指出。感谢 electronixtar 提供建议。
::Code by lxmxn @ bbs.cn-dos.net
:::::::::: GetASCII.Bat ::::::::::::
::Date 22:50 2007-1-9

@echo off&mode con cols=80
:begin
cls
set/p file=请输入要处理的文件(Q 键直接退出此脚本):
        if /i "%file%"=="Q" goto :eof
        if "%file%"=="" goto error
set new=%random%
for %%a in (%file%) do set size=%%~za
        if "%size%"=="0" goto error
cls&fsutil file createnew %new% %size% >nul
echo=&&echo=文件内容所对应的ASCII码的十六进制形式依次为:&echo==========================================================
for /f "skip=1 tokens=3" %%a in ('fc /B %new% %file%') do (
        set /p=%%a <nul
)
echo=&echo==========================================================&echo=&echo=&echo=文件内容所对应的ASCII码的十进制形式依次为:&echo==========================================================
setlocal EnableDelayedExpansion
for /f "skip=1 tokens=3" %%a in ('fc /B %new% %file%') do (
        set num=%%a
        set /a num=0x!num!
        set /p=!num! <nul
)
del %new%
endlocal&echo;&echo==========================================================&echo;&pause
exit /b 0

:error
        cls&echo;&echo;
        echo         “输入错误” OR “文件大小为零”,请重新输入……
        del %new% >nul 2>nul
        set file=
        set new=
        pause>nul&goto :begin


[ Last edited by lxmxn on 2007-1-10 at 09:17 PM ]
作者: ccwan     时间: 2007-1-10 21:06
除了钦佩没有什么别的了。^_^
作者: vkill     时间: 2007-1-11 01:17
没明白
作者: 0401     时间: 2007-1-11 01:37
这句漂亮
fsutil file createnew %new% %size%
这样创建后的文件其16进制全为0,也就不会与其他字符相同了。难得兄能有这样的细心发现这点,佩服啊。缺点是必须ADMIN组才能用。
http://www.cn-dos.net/forum/viewthread.php?tid=24715#pid151384
这里的方法也很漂亮,将文件分别与同字节的a和b比较,然后再sort就可以得到按字节顺序排列的16进制数了。
作者: electronixtar     时间: 2007-1-11 01:49
呵呵,lxmxn的p处理太漂亮啦,可惜昨天加分加完了,下次记着给你加分啦
作者: lxmxn     时间: 2007-1-11 02:07

  RE vkill :
  
  这个批处理就是将文件的内容转化为ASCII的形式啊。比如现在有个文件file.txt的内容如下:

  Quote:
www.cn-dos.net

  
  那么运行这个批处理,输入file.txt之后,就会得到下面的ASCII码的十六进制和十进制形式:(不过要是ADMIN组的成员,局限性)

  Quote:
文件内容所对应的ASCII码的十六进制形式依次为:
=========================================================
77 77 77 2E 63 6E 2D 64 6F 73 2E 6E 65 74 0D 0A
=========================================================


文件内容所对应的ASCII码的十进制形式依次为:
=========================================================
119 119 119 46 99 110 45 100 111 115 46 110 101 116 13 10
=========================================================

请按任意键继续. . .

  RE 0401 :

  多谢兄的指点和鼓励。又有这么多方法可以学了。



  RE electronixtar :

  多谢兄的肯定,呵呵,我还要感谢兄的建议呢。
  

作者: redtek     时间: 2007-1-11 02:25
甚是欣赏lxmxn兄精彩代码!!!
不仅代码精彩而且还是一种创新~:)))

能够看到lxmxn和electronixtar兄的思想真是一种享受~:)
作者: pengfei     时间: 2007-1-11 11:19
原来fc可以这样, electronixtar兄知识面很广啊, lxmxn兄脚本功底越来越强了! ^_^
作者: Eblis     时间: 2007-1-11 11:54
看不懂..能不能说明一下?
作者: pengfei     时间: 2007-1-11 12:35
我也传一个用C写的文本ASCII码的十进制和十六进制转换程序.

ascii.exe test.txt save.txt

如上程序有两个参数, 第一为要转换的文件名, 第二个为转换后保存的文件名. 第二个参数可以不要.

对中文字符转换十进制形式表示为负数, 十六进制形式为非正常显示.
附件 1: ascii.rar (2007-1-11 12:52, 4.28 K, 下载附件所需积分 1点 ,下载次数: 48)

作者: qasa     时间: 2007-1-11 17:15
佩服,思路很好。加分支持~~~
作者: lxmxn     时间: 2007-1-12 07:15


  Quote:
Originally posted by Eblis at 2007-1-10 22:54:
看不懂..能不能说明一下?


  思路已经说了啊,还有哪些不懂呢?

作者: hxuan999     时间: 2007-1-12 10:26
正好要这个,呵,谢谢了.
作者: nicholasmaxwell     时间: 2007-1-14 02:12
庭好玩,收下了
作者: ytfsse     时间: 2007-1-15 12:45
好厉害呀
作者: Eblis     时间: 2007-1-15 14:58
能不能反过来?从ACSII码获得原文?..有时候一些注册表或者数据包以ACSII的时候..可以直接读过来多好..不用去查了..
作者: lxmxn     时间: 2007-1-15 15:08

  这个我也一直在想,但是批处理来完成似乎有点麻烦,感觉利用VBS的chr()函数来获取更好一些。

作者: electronixtar     时间: 2007-1-16 00:46
理论上绕弯子怎么绕都可以用批处理写任意二进制文件,但是那个不是一般的麻烦啊,而且效率肯定不高呀。所以还是vbs吧,vbs也麻烦,用 adodb.stream ,还要用 adodb.recordset 或者 xmldoc 来产生 bytearray 类型,因为FSO不支持二进制文件写入
作者: Eblis     时间: 2007-1-16 12:25
呵呵..那我再问一个问题...fsutil file createnew 产生的代码为16进制的0..有没有可能会遇到原文件里的代码就是0..比如说fsutil fsinfo drives命令的输出就是16进制的0

  刚刚自己测试了一下...其它不同的代码能显示出来..但是代码中的空格就没办法了``

    不过也好``应该很少遇到16进制的0的文件吧?
作者: lxmxn     时间: 2007-1-16 15:34

  这个可以处理空格的。文件中很少会出现ASCII为00的字符,所以没有考虑。

作者: benteng302     时间: 2007-5-14 20:03
哦,太厉害了赔付。
作者: xiaoyong12     时间: 2009-4-11 12:13
真牛
作者: netbenton     时间: 2009-4-11 13:36
原来还有这个命令:fsutil file

我做这个时,用set/p=[空格],生成一个纯空格的文件,相同时补上20h,虽然可以做到。却是绕了个大弯。

在这里学习了。
作者: 523066680     时间: 2009-12-3 20:22
回眸一看这个错过的帖子,学无止境呀
作者: bigbadwolf     时间: 2010-10-5 16:35
值得学习一下!
作者: zch1366     时间: 2010-10-9 14:05
呵呵,谢谢指教。
作者: 5981664     时间: 2010-10-12 13:04
好厉害呀
作者: gool123456     时间: 2010-10-14 01:58
对FC了解太少了 . 版主这个好啊  .我以前是通过另一种方法获取的 . 但不方便.
作者: liangshenda     时间: 2010-12-25 00:43
谢谢啦!!!!!!!!!