|
yy2372575
初级用户
 
积分 73
发帖 26
注册 2006-5-3
状态 离线
|
『楼 主』:
如何将一个文本中的最后若干个字节去掉
有人发了这个帖,我看了,代码如下
@echo off
if "%1"=="" echo 参数错误,请重新设定参数……&&pause&&goto :eof
set file=%~s1
set /a size=%~z1
set /a num=%~z1-100
fsutil file setzerodata offset=%num% length=100 %file%
pause
但是不好使。而另一个代码
echo exit|%ComSpec%/kprompt a$_sub cx,64$_$_t$_w$_q$_|debug a.ini>nul
不知道为什么会在文本前开头产生乱码,没办法,只好旧调重弹,向高手求教!!!
说明:FOR命令在纯DOS下不好使
|
|
2006-12-21 01:07 |
|
|
redtek
金牌会员
     
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
2 楼』:
哈哈……多谢yy2372575兄提醒~:)
我知道原因了,
原来是执行 MOV CX,64 把 CX寄存器值减去100时这条指命写在了地址 100H ,
虽然正确执行,但却把被装入的文件的前几个字符被这条指令给覆盖掉了~:)
所以,文件前几个字符乱码状态~:)
|

Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2006-12-21 01:38 |
|
|
redtek
金牌会员
     
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
3 楼』:
这回不会再覆盖文件前几个字节了,躲开了文件内容所在的地址~:)
处理文件大小不超过64KB:)
echo exit|%ComSpec% /k prompt a0001$_sub cx,64$_$_t$_w$_q$_|debug aa.ini>nul
|

Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2006-12-21 01:44 |
|
|
yy2372575
初级用户
 
积分 73
发帖 26
注册 2006-5-3
状态 离线
|
『第
4 楼』:
不行呀!上回能删掉后面字节,可这个为什么对文件丝毫没有改动呢?麻烦你再试试行吗?谢谢
|
|
2006-12-21 03:16 |
|
|
redtek
金牌会员
     
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
5 楼』:
不好意思,我忘了 “告诉” 代码执行哪个地址的指令了~:)
改过来了,这回试验可以了~:)
echo exit|%ComSpec% /k prompt a0001$_sub cx,64$_$_t=0001$_w$_q$_|debug aa.ini>nul
|

Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2006-12-21 03:25 |
|
|
yy2372575
初级用户
 
积分 73
发帖 26
注册 2006-5-3
状态 离线
|
『第
6 楼』:
先谢谢大力帮助,这个代码也能删,可是为什么我把64换成10后,它删掉的字符不确定,显示的删掉是0000A,可文本里确删掉3--14个字符不确定?为什么呢?是不是对文本有什么输入要求呢?文本绝对只有英文不含汉字
|
|
2006-12-21 06:03 |
|
|
redtek
金牌会员
     
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
7 楼』:
sub cx,64 相当于高级语言里的 CX = CX-64H(16进制运算)
那个64是16进制,换算成10进制就是 100 ,意思是当前所装入的这个文件的总长度减去100B(字节)的长度。
不管是文本还是可执行文件,它就减原文件长度的100个字节的长度。
(就是把当前指定的文件减少100Byte)
[ Last edited by redtek on 2006-12-20 at 05:15 PM ]
|

Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2006-12-21 06:13 |
|
|
yy2372575
初级用户
 
积分 73
发帖 26
注册 2006-5-3
状态 离线
|
『第
8 楼』:
我试了连用ECHO向文本里输入删掉的字符也不确定,我试验了一下把64改成0C时删掉的是最后10个字符。不知道为什么!!!
|
|
2006-12-21 06:39 |
|
|
redtek
金牌会员
     
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
9 楼』:
0C的10进制是 12。
但是,在一个文件中,回车符与换行符我们是看不到的,可是它照样要占用空间。
回车符16进制是 0D ,它的10进制是13(常常编程里用到的那个熟悉的数字)
换行符16进制是 0A ,它的10进制是10。
所以,当你在文本文件中所输入一串字符以后仅仅打了一个回车,那么这可就占了两个字节的宽度,只是一般没有注意到而已(因为看不见)
|

Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2006-12-21 06:46 |
|
|
redtek
金牌会员
     
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
10 楼』:
(假如我建立一个新文件,取名为 A.TXT )
C:\TEMP\debug>copy con a.txt
^Z
1 file(s) copied.
(我建立的上面的文件内容,我只按3次回车键)
(那个^Z是我按的 Ctrl+Z 保存文件的一个快捷键)
(下面用 Debug 工具调出 a.txt 文件来,看看到底怎么回事)
C:\TEMP\debug>debug a.txt
-rcx
CX 0006 (这个6代表文件长度是6个字节)
:
-d
0AF5:0100 0D 0A 0D 0A 0D 0A 31 31-31 31 31 31 0D 0A 31 31
0AF5:0110 31 31 31 31 31 31 31 31-31 31 0D 0A 34 00 E4 0A
0AF5:0120 F6 06 15 99 20 75 0A 80-3E D2 99 00 75 BB 49 74
0AF5:0130 B8 BA 0D 8C EB 23 33 D2-87 D1 B8 01 42 CD 21 A3
0AF5:0140 DF 99 89 16 E1 99 80 3E-C5 96 00 74 9C B4 40 CD
0AF5:0150 21 72 5F C6 06 E3 99 1A-C3 E8 FF 0F FE 06 D2 96
0AF5:0160 80 3E D1 96 00 74 48 8B-1E 13 99 83 FB 00 7E 33
0AF5:0170 8B 0E E1 99 8B 16 DF 99-8B C1 0B C2 74 21 B8 00
-q
(现在 Dir 看一下这个文件的大小)
C:\TEMP\debug>dir a.txt
Volume in drive C is DISK-C
Volume Serial Number is 4089-CA39
Directory of C:\TEMP\debug
2006-12-20 17:51 6 a.txt
1 File(s) 6 bytes
0 Dir(s) 1,301,233,664 bytes free
(看到了,是6个字节) 刚才在 Debug 工具中所看到的这个我只按了3次回车键的这个文本文件里16进制所显示的内容为:
0D 0A 0D 0A 0D 0A
0D是回车符
0A是换行符
一共6个,每个符号占用了一个字节。
(上面的16进制是为显示和阅读方便)
(所以表面上看到一个文件中最后的几个字节,当我数着一共有多少个字节我要删掉时,其实还应该计算那些看不到的回车换行符)
[ Last edited by redtek on 2006-12-20 at 07:37 PM ]
|

Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2006-12-21 06:55 |
|
|
yy2372575
初级用户
 
积分 73
发帖 26
注册 2006-5-3
状态 离线
|
『第
11 楼』:
我对你的敬仰如滔滔江水连绵不绝。。。。。。多谢指点!!感谢。
|
|
2006-12-21 08:24 |
|
|
lxmxn
版主
       
积分 11386
发帖 4938
注册 2006-7-23
状态 离线
|
『第
12 楼』:
在DOS下面应该没有fsutil这个命令,所以无法执行。
|
|
2006-12-21 12:12 |
|
|