找回密码
 加入
搜索
查看: 6837|回复: 26

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

[复制链接]
发表于 2008-6-28 14:36:31 | 显示全部楼层 |阅读模式
使用2进制 读取文件时
$File = FileOpen (文件名,16)
$FileString = FileRead($File)
FileClose($File)
由于$FileString 输出的是2进制数值
有没有比较好的方法修改指定位置的数值。(重点是修改)
并将其再写入原来文件

[ 本帖最后由 zhang0121 于 2008-7-1 16:36 编辑 ]
 楼主| 发表于 2008-6-28 14:55:13 | 显示全部楼层
功能上有点像UltraEdit的Hex修改
发表于 2008-6-28 17:54:25 | 显示全部楼层
应该可以。不过去是比较麻烦罢了。。。算清楚你要修改的位置即可。
发表于 2008-6-29 09:26:15 | 显示全部楼层
autoit好像没有定位语句,处理文本内容很麻烦
 楼主| 发表于 2008-6-30 01:06:47 | 显示全部楼层
希望大家给点意见
 楼主| 发表于 2008-6-30 01:19:19 | 显示全部楼层
在做的时候确实碰到了很多问题
思路:
$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

但却无法实现修改
希望大虾、大家给予提出修改的意见和建议
发表于 2008-6-30 11:45:41 | 显示全部楼层
读取一个文件,生成另一个文件,其中的过程中,替换要修改的。旧文件改成bak。呵呵,不知能行不?
 楼主| 发表于 2008-6-30 13:24:04 | 显示全部楼层
关键问题在如何替换
有没有好的替换思路
 楼主| 发表于 2008-6-30 13:25:32 | 显示全部楼层
昨天晚上 试了下
用binary()和string()两个函数
相互转换
再结合 stringleft() stringright()进行定位和修改
 楼主| 发表于 2008-6-30 13:25:54 | 显示全部楼层
效果不是很好
不知道是定位不准确 还是修改的不对
发表于 2008-6-30 13:32:21 | 显示全部楼层
文件不能太大,我用au3打开600+M的GHO文件,读不完就死机了。
发表于 2008-6-30 14:00:38 | 显示全部楼层
$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 16:06:03 | 显示全部楼层
原帖由 顽固不化 于 2008-6-30 13:32 发表
文件不能太大,我用au3打开600+M的GHO文件,读不完就死机了。


这段时间一直在找一个能打开GHO文件来编辑替换的办法,直接读取肯定不行,应该是将里面的文件接出来修改或者用文件替换,就和ISO文件这样,用命令行编辑就很方便
 楼主| 发表于 2008-6-30 17:04:19 | 显示全部楼层
昨天晚上 试了下
用binary()和string()两个函数
相互转换
再结合 stringleft() stringright()进行定位和修改

下午对定位进行了修改
可以实现

但缺陷是 速度很慢
对某个8M多文件 进行了400多出的修改 结果是用了几分钟

如何改进速度成为问题的关键

能否通过多进程的方式提升速度
希望 高手给予指点
 楼主| 发表于 2008-6-30 17:32:05 | 显示全部楼层
以下是我的主要代码;$FilePath文件的大小为8M;_Change($i,$j,$k)的调用400多次
[au3]$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[/au3]
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-7 04:07 , Processed in 0.076579 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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