FileOpen (文件名,16)情况下,对FileRead返回值的修改
使用2进制 读取文件时$File = FileOpen (文件名,16)
$FileString = FileRead($File)
FileClose($File)
由于$FileString 输出的是2进制数值
有没有比较好的方法修改指定位置的数值。(重点是修改)
并将其再写入原来文件
[ 本帖最后由 zhang0121 于 2008-7-1 16:36 编辑 ] 功能上有点像UltraEdit的Hex修改 应该可以。不过去是比较麻烦罢了。。。算清楚你要修改的位置即可。 autoit好像没有定位语句,处理文本内容很麻烦 希望大家给点意见 在做的时候确实碰到了很多问题
思路:
$File = FileOpen (文件名,16)
$FileString = FileRead($File)
返回的$FileString是一个数值型数据
使用$BinaryLen= BinaryLen ( $FileString)获得长度
使用$BinaryMid = BinaryMid ( 二进制数据, 开始)
再使用If...Then...EndIf 返回值$BinaryMid 与目标数值比较 如果与目标数值相同 则获得了需要中间的位置 附值给$Point
位置$Point是一个10进制数值
关键:
对原$FileString文件内容进行修改
$L = 256^($BinaryLen - $Point)
$FileString = $FileString - $BinaryMid*$L + 所要修改的数值*$L
但却无法实现修改
希望大虾、大家给予提出修改的意见和建议 读取一个文件,生成另一个文件,其中的过程中,替换要修改的。旧文件改成bak。呵呵,不知能行不? 关键问题在如何替换
有没有好的替换思路 昨天晚上 试了下
用binary()和string()两个函数
相互转换
再结合 stringleft() stringright()进行定位和修改 效果不是很好
不知道是定位不准确 还是修改的不对 文件不能太大,我用au3打开600+M的GHO文件,读不完就死机了。 $File1 = FileOpen ("file1",16)
if FileExists("file2") then FileDelete("file2")
$File2=FileOpen ("file2",17)
While 1
$Bytes=FileRead($file1,1)
if $Bytes="" Then ExitLoop
_write($Bytes)
WEnd
FileClose($File1)
FileClose($File2)
Func _write($Bytes)
;if $Bytes="0A" then $Bytes="0A"
FileWrite($File2,$Bytes)
EndFunc 原帖由 顽固不化 于 2008-6-30 13:32 发表 http://www.autoitx.com/images/common/back.gif
文件不能太大,我用au3打开600+M的GHO文件,读不完就死机了。
这段时间一直在找一个能打开GHO文件来编辑替换的办法,直接读取肯定不行,应该是将里面的文件接出来修改或者用文件替换,就和ISO文件这样,用命令行编辑就很方便 昨天晚上 试了下
用binary()和string()两个函数
相互转换
再结合 stringleft() stringright()进行定位和修改
下午对定位进行了修改
可以实现
但缺陷是 速度很慢
对某个8M多文件 进行了400多出的修改 结果是用了几分钟
如何改进速度成为问题的关键
能否通过多进程的方式提升速度
希望 高手给予指点 以下是我的主要代码;$FilePath文件的大小为8M;_Change($i,$j,$k)的调用400多次
$FilePath = "*.*"
$FileHwnd = FileOpen ($FilePath, 16)
$FileString = FileRead($FileHwnd)
$BinaryLen = BinaryLen($FileString)
FileClose($FileHwnd)
$Times = 0
ProgressOn ( "", "" , $Times , 0 , 0 ,2+16)
_Change(1235995,"74","90");
$FileString = Binary($FileString)
$FileHwnd = FileOpen ($FilePath, 2+16)
FileWrite($FilePath,$FileString)
FileClose($FileHwnd)
Func _Change($i ,$j ,$k);$i 位置;$j 原来值;$k 改后值;保存原值的目的是为了以后做还原
If StringMid($FileString , $i*2+1, 2) == $j Then
$StringLeft = StringLeft($FileString,$i*2)
$StringRight = StringRight($FileString,$BinaryLen*2-$i*2)
$FileString = $StringLeft & $k & $StringRight
$Times += 1
EndIf
ProgressSet ( Int($Times*100/429), $Times)
EndFunc
页:
[1]
2