求助!要替换一个二进制文件中的字串的函数,类似replace('文件名', '003e', '53e2e6c3fs');(200分)

  • 主题发起人 主题发起人 juchen
  • 开始时间 开始时间
J

juchen

Unregistered / Unconfirmed
GUEST, unregistred user!
我搜索过这档类似问题,如
http://www.delphibbs.com/delphibbs/dispq.asp?lid=231679
但时回答的并不满意,Fudei提供源码调用函数名和与函数不符
那函数是处理十进制文件的,并且长度必须相同。
我想要一个不管替换字段是多少字节甚至是空字节,最好有文件打开成功与否提示的函数。
引述:
将一个二进制文件中的"0A 0B 0C 0D"改成"1A"或者更多一些字符"1A 1B 1C 1D 1E";
我把我刚注册的积分给全给各位了!
 
我这个问题很难?还是太简单了呀?
我刚来大富翁,大家帮帮我这位初学者哦
 
真巧,这个我问题我刚解决,如果是比较小的文件,可以自己写遍例函数,
如果是比较大的文件请参考:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=515889
 
我看过你的问题,用到了文件映射及数据指针比较可行,但是对于被搜索字段和替换字段长度不相同的情况下,用指针好像很困难呀
如本是来是66778899现在替换成2233那么后面8899所占位置怎么去掉呢
如果替换成更长的串,那么从那里要空间呢?
 
你可以试试先将内容读到TStrings中,再进行操作。
 
可以自己处理读缓冲和写缓冲,对读缓冲中的数据进行replace处理后写入写缓冲,写缓冲
满后写入文件。当然,缓冲区长度最起码要大于源串和目的串的长度。
 
这种处理好象必须在两个文件里操作,至少要有一个临时文件,在一个文件中操作好象会冲突吧?
能不能直接通过类似于改写的方式,不产生多余文件而实现呢?
因为我是一个初学者,如果有代码表示更好,谢谢各位。
 
同意CJF的方法:先将内容读到TStrings中,然后实现字符串中字串的替换。

写了个小函数,改改用了。

function replacing(S,source,target:string):string;
var site,StrLen:integer;
begin
{source在S中出现的位置}
site:=pos(source,s)

{source的长度}
StrLen:=length(source);
{删除source字符串}
delete(s,site,StrLen);
{插入target字符串到S中}
insert(target,s,site);
{返回新串}
replacing:=s;
end;
 
S,source,target均有可能是二进制值如:00 e4 00 f4 也可么?
碰到00后,字符串会不会自动截断呢?
我试过一个倒子,但是一碰到一个00就马上截断了,如果那个二进制文件一开始就是一个#0
最后处理的结果是0字节的文件呢
 
喔,终于帮我想出来了,谢谢各位劳苦功高的朋友,
我想出了思路选把所有的处理的数据都换成16进制(包括文件的数据),好象就可以了,
谢谢各位。
也不知道这样分配分数合理不合理[:D]
 
后退
顶部