找回密码
 加入
搜索
楼主: zhang0121

FileOpen (文件名,16)情况下,对FileRead返回值的修改

[复制链接]
 楼主| 发表于 2008-6-30 19:41:21 | 显示全部楼层
运行时间很长 运行速度很慢
希望大虾帮忙解决
发表于 2008-6-30 19:53:56 | 显示全部楼层
试了一下,读取也慢。无法了~~~~
不知用字符串替换能否快一点。。。

[ 本帖最后由 顽固不化 于 2008-6-30 20:41 编辑 ]
 楼主| 发表于 2008-6-30 21:00:49 | 显示全部楼层
单纯的字符替换就是怕 不准确啊
发表于 2008-6-30 21:40:12 | 显示全部楼层
我试验了一下,只要你的位置确定的和准确的,字符串替换法是可行的。
$nstr=StringReplace($FileString,$i,"FC")
关键是位置$I一定要准确,不知你的$i是怎么得来的。
$FilePath = "173242.rar"
$FileHwnd = FileOpen ($FilePath, 16)
$FileString = FileRead($FileHwnd)
FileClose($FileHwnd)
$nstr=StringReplace($FileString,17,"FC")
$FileHwnd = FileOpen ($FilePath&".bak", 2+16)
FileWrite($FileHwnd,$nstr)
FileClose($FileHwnd)
Exit

这是生成后的差异比较结果:
查找差异

1. D:\173242.rar: 541,602 字节
2. D:\173242.rar.bak: 541,602 字节
Offsets: 16 进制

    7:        CF        FC

1 差异 找到。 


其位置数据很重要,17,实际是第7字节的第一位置,算下来是第15位置(从0偏移开始计算),加上字符串前面的“0x”就是正确的位置17了。。。

[ 本帖最后由 顽固不化 于 2008-6-30 21:51 编辑 ]
 楼主| 发表于 2008-7-1 12:04:01 | 显示全部楼层
我的$i查找思路
[au3];=====================================================
Dim $FilePath[2],$FileHwnd[2],$FileString[2],$BinaryLen[2],$String[2]
;=====================================================
$FilePath[0] = "*.dll";设定文件1的路径
$FilePath[1] = "*.dll"设定文件2的路径
For $i= 0 To 1;分别读取并文件内容到$FileString[0],$FileString[1]
        $FileHwnd[$i] = FileOpen ($FilePath[$i], 16)
        $FileString[$i] = FileRead($FileHwnd[$i])
        $BinaryLen[$i] = BinaryLen($FileString[$i])
        FileClose($FileHwnd[$i])
Next
$BinaryLenMin = _Min ( $BinaryLen[0], $BinaryLen[1]);比较字节长短,如果字节不同 选择较短的为标准
;=================================================
$FileHwnd = FileOpen(@ScriptDir & "\" & "差异.txt",2+8);把差异的位置输出到 差异.txt文件
Check(1,$BinaryLenMin)
;------------------------------
;把输出到 差异.txt 的内容粘贴到这里
;------------------------------
Func Check($l,$m)
ProgressOn ( "执行过程", "进度" , "0/" & $m , 0, 0,2+16)
$j = 100000;为步进基数 每次都需要更改 一般我依次设置为100000、10000、1000、100、10、1
For $i = $l To $m Step $j
        $String[0] = BinaryMid($FileString[0],$i,$j)
        $String[1] = BinaryMid($FileString[1],$i,$j)
        if $j > 1 then
        If $String[0] <> $String[1] Then FileWrite ($FileHwnd,"Check(" & $i & "," & $i+$j-1 & ")" & @CRLF)
        else
        If $String[0] <> $String[1] Then FileWrite ($FileHwnd,$i & "." & StringRight($String[0],2) & "," & StringRight($String[1],2) & @CRLF);
     endif
        ProgressSet ( 100*$i/$m , $i&"/"&$m)
Next
EndFunc
FileClose($FileHwnd)
;===============================================
[/au3]
最后一次输出的格式是:位置&"."&文件一的不同&"."&文件二的不同& @CRLF

[ 本帖最后由 zhang0121 于 2008-7-1 12:08 编辑 ]
 楼主| 发表于 2008-7-1 12:10:31 | 显示全部楼层
我认为这样能够提升查找的速度,分块查找
以10为区块基数
进行划分 查找

这样查找能提速的原因在于
1.不是每一个字节都是不同的,不同的部分是少数
2.不同的部分比较集中表现
发表于 2008-7-1 12:34:13 | 显示全部楼层
怎么又变成比较差异了?跟你原来说的替换某值是两回事了,
 楼主| 发表于 2008-7-1 12:44:44 | 显示全部楼层
[au3]查找差异

1. D:\173242.rar: 541,602 字节
2. D:\173242.rar.bak: 541,602 字节
Offsets: 16 进制

    7:    CF    FC

1 差异 找到。 [/au3]

只是对这里 提出点自己的关点

还有就是对于替换 还没有想出什么 好的方法 提升速度
所以随便整两句上来
 楼主| 发表于 2008-7-1 12:51:37 | 显示全部楼层
我还在想其他的思路
比如 由于要修改多处
把要修改的地址 如:$point[1],$point[2],$point[3],$point[4]
四个为非连续的位置
在整个$filestring当中根据 array $point[$i] 数组指示的位置 将其分割成数组
$string[0] = stringmid($filestring,1,$point[1]-1)
$string[1] = stringmid($filestring,$point[1]+1,$point[2]-$point[1])
$string[2] = stringmid($filestring,$point[2]+1,$point[3]-$point[2])
$string[3] = stringmid($filestring,$point[3]+1,$point[4]-$point[3])
$string[4] = stringmid($filestring,$point[4]+1,$binarylen-$point[4])

最后再依次使用"&"连接起来 中间插入修改的值

从而减少过多的字节操作 提升速度
但这种思路对于 大文件 是否有也有效 就不清楚了
发表于 2008-7-1 12:54:28 | 显示全部楼层
那个图是我用字符串替换函数,替换前后的结果对比。是在winhex里整的,只是说明字符串替换这个方法是可行的。并且,只要知道了要替换的1字节在文件的位置,这种替换方法非常快。
 楼主| 发表于 2008-7-1 13:22:36 | 显示全部楼层
原来如此
谢谢 确实很有效
发表于 2008-7-1 14:05:49 | 显示全部楼层
原帖由 zhang0121 于 2008-7-1 13:22 发表
原来如此
谢谢 确实很有效


张先生,问题解决了吗?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-7 12:20 , Processed in 0.066743 second(s), 13 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表