Board logo

标题: 怎么用debug 命令实现将数字文本(ASCII)文件转换成二进制文件 [打印本页]

作者: enjoyer     时间: 2006-11-28 09:50    标题: 怎么用debug 命令实现将数字文本(ASCII)文件转换成二进制文件

我知道可以用e命令将数字从键盘输入, 再用w写文件的办法实现. 但这样很是麻烦. (如果用重定位的办法,文本里又要插入很多的e命令和空格) 诸位有没有更好的办法呢?

[ Last edited by enjoyer on 2006-11-29 at 07:34 AM ]
作者: enjoyer     时间: 2006-12-1 01:40    标题: 怎么,作不到吗?

没人回,自己顶一下
作者: enjoyer     时间: 2006-12-1 01:43    标题: 真地没办法了吗?

还是没人知道, 应个声吗.
作者: DOSforever     时间: 2006-12-1 07:04
说实话,我没能理解你的意思。你说的二进制文件是怎么个二进制文件?最好举例说明一下。
作者: redtek     时间: 2006-12-1 07:30
来看下面这个贴子,可能会有兄需要的内容~:)


此代码会生成临时文件.如何让它不生成
http://www.cn-dos.net/forum/view ... id=mf2rxE#pid155430
作者: enjoyer     时间: 2006-12-1 10:25    标题: 更详细的解释...



  Quote:
Originally posted by DOSforever at 2006-12-1 07:04:
说实话,我没能理解你的意思。你说的二进制文件是怎么个二进制文件?最好举例说明一下。

怪我没说明白, 举个例子吧. 比如说在notebook里随意键入一串数字, 保存. 此时计算机磁盘里保存的是这些数字的 ASCII码,  而我想让得到的是真值. 怎么办? 除自己写程序外, 我想到的一个办法是:
编辑文本, 内容如下:
e100 32  34  f5  53  8a 8c 98 2e
e108 5f  ff  fe  30  5b 1e 20 39
... ...
n num.txt
rcx
xx
w
q
保存为1.txt 后,进入dos窗口,来到保存路径下: debug <  1.txt 回车
于是就生成 二进制文件 num.txt (可以用debug 加载验证)
但这种方法要在数字里加入空格, 各行前都要有debug命令e..., 而且要计算行首对应地址, 仍嫌麻烦. 就是想知道debug有没有更便捷的方法,完成这个转换.  
请兄帮帮忙, 多谢关注.
还有redtek兄也谢谢你的热心, 不过我对dos批处理不懂, 看来还得跟论坛的朋友多学学练练才是.
作者: DOSforever     时间: 2006-12-1 11:27


  Quote:
此时计算机磁盘里保存的是这些数字的 ASCII码,  而我想让得到的是真值.

我是这么认为的:实际上计算机中所有的数据都是以二进制形式保存和流动的,不存在以ASCII码保存或以真值保存这种说法,只是当这些数据显示给你看的时候,你想以什么形式给显示出来。可以以十六进制形式、ASCII码形式、二进制形式、八进制形式等等。只是前两种是我们最常用的形式。
根据你的例子,我想你是想得到文件内容中每个字节的十六进制的值是什么,对吗?也就是说,对一个已知文件想让它以十六进制值的方式显示出来,对吗?
作者: enjoyer     时间: 2006-12-2 07:36    标题: 回复DOSforever



  Quote:
Originally posted by DOSforever at 2006-12-1 11:27:


我是这么认为的:实际上计算机中所有的数据都是以二进制形式保存和流动的,不存在以ASCII码保存或以真值保存这种说法,只是当这些数据显示给 ...

你说的没错, 在计算机内部都是二进制表示,并没有区别. 如果我想看某一文件的二进制内容,可以用UltraEdit的16进制方式 , 或者debug 加载查看. 这没有问题. 某些文本编辑器(象debug,UE32) 带有从bin到ASCII值的转换,    即:
    45H(bin形式存于内存中) -> 34 35(ASCII值) ->按ASCII表对应关系显示(显示器)
我想要的功能刚好相反, 如下:
34 35(保存在内存中的ASCII值) -> 45H (保存在内存中的bin)
  即完成一个文本数据到二进制的转换.  如果数据很少还可以, 用先前的文件重定向办法就能应付, 关键是批量数据就不好办了.

[ Last edited by enjoyer on 2006-12-2 at 08:27 AM ]
作者: DOSforever     时间: 2006-12-2 09:31
我是看得有点糊涂了,你的理解可能对的,但你的表达我认为有点错误。我是使劲的想,费力的思考。大概有点猜对你的意思了。

“45H”就已经是表示ASCII码值了,即该字节的二进制值为 01000101B ,表示成十六进制值为 45H ,你看到的 45 ≠ "4" "5" 这两个字符(当然,为了告诉你它的十六进制值为多少,显示出来的是"4"和"5"这两个字符)。45H 所对应的ASCII码字符为 "E" 。所以应该这么说我认为比较确切些:

01000101B(bin形式存于内存中)-> 45H(hex表示。ASCII值)-> 字符"E"(按ASCII表码值对应的字符显示出来)

你的问题应该这么说:已知ASCII码值(并且是十六进制的),求如得到它对应的ASCII字符。对吗?是这意思吗?
作者: enjoyer     时间: 2006-12-3 07:13
呵呵,其实我也是使劲的想,费力的思考,想让你很容易地明白我的问题, 没想到反而弄巧成拙了(因为是按自己的理解来解释). 为不再造成误解, 我用尽量少的语句说明白:
     文件A,内容:  00110100 00110101(34H,35H占两个字节) ->  文件B, 内容: 01000101(45H,占一个字节) , 上面的转换我不想自己编程,想用debug命令实现.问,有没有这种可能.
作者: DOSforever     时间: 2006-12-3 09:28
除了你不想用的 e 命令外,没有用 debug 实现的这种可能。
可以用 4DOS 的 @char 变量函数加以转换,如果你原文件的内容全都是十六进制的数值,可以在 @char 中嵌套 @convert 变量函数转换十六进制值为十进制值,因为 @char 只能用十进制数作为变量。
作者: enjoyer     时间: 2006-12-3 09:38
没学过批处理, 先学学再说吧, 谢谢了
作者: 不得不爱     时间: 2006-12-3 09:51
我想可以用命令生成一个和目标文件一样大小的文件,然后用FC/B命令来进行2进制比较,然后将比较的结果里是目标文件里的二进制取出来保存为文件就可以了
作者: qzwqzw     时间: 2006-12-4 07:19
楼上仍然理解反了!

而且没有多大的实现可能性,因为fc/b只显示不同的字节值,这样目标内容势必会有丢失。

建议楼主看看这个帖子

http://www.cn-dos.net/forum/viewthread.php?tid=21955&fpage=1
作者: tigerpower     时间: 2006-12-4 13:38
使用 mawk :

E:\>dir /b mawk.exe hex.txt hex2ascii.awk
mawk.exe
hex.txt
hex2ascii.awk

E:\>more hex.txt
20 20 bb b6 d3 ad c0 b4 b5 bd d6 d0 b9 fa 44 4f
53 c1 aa c3 cb c2 db cc b3 0d 0a 57 69 6e 64 6f
77 73 d0 c2 d2 bb b4 fa c3 fc c1 ee d0 d0 b9 a4
be df be a1 d4 da 3a 0d 0a 20 20 20 57 69 6e 50
45 a1 a2 50 6f 77 65 72 53 68 65 6c 6c b0 e5 bf
e9 21 0d 0a

E:\>more hex2ascii.awk
{gsub(/[ \n]*/,"")
for (i=1;i<=length($0)/2;i++){
        cmd=sprintf("mawk \"BEGIN{printf \\\"\x%s\\\"}\"\n",substr($0,i*2-1,2))
        system(cmd)}}

E:\>mawk -f hex2ascii.awk hex.txt

更多命令行工具,请到本论坛的
WinPE、PowerShell板块(点击进入)



作者: electronixtar     时间: 2006-12-30 13:16
TigerPower实在是厉害,顶
作者: lxmxn     时间: 2007-7-4 14:10
To tigerpower:

测试了一下这个awk脚本,好像不行啊。