不
不要踩我
Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个格式,主要想用于文件补丁,可是不知道为什么老是不对,不知道错在哪里,希望能给我看看错在哪里
首先说一下文件格式
------------------------------------------------------------------------
XX XX XX XX XX AA AA AA AA BB BB CC CC .. CC .... ZZ ZZ ZZ ZZ
分析:
------------------------------------------------------------------------
XX XX XX XX XX 这五个是我标识的文件开头
------------------------------------------------------------------------
AA AA AA AA 这4个字节是我藏的地址
比如 00 00 01 02
那么我要写入另外一个文件的地址就是 $00000102.,所以编写时没有使用integer
------------------------------------------------------------------------
BB BB 从地址AAAAAAAA开始需要连续写入的数量
比如 03 04
那么我要写入另外一个文件的长度就是 $0304.
------------------------------------------------------------------------
CC CC .... 等到 BB BB这个数量后开始读取BBBB个长度的数组
------------------------------------------------------------------------
.... 然后在循环继续上面三步
------------------------------------------------------------------------
ZZ ZZ ZZ ZZ 我标识的文件结尾
------------------------------------------------------------------------
下面是我的代码:
首先说一下文件格式
------------------------------------------------------------------------
XX XX XX XX XX AA AA AA AA BB BB CC CC .. CC .... ZZ ZZ ZZ ZZ
分析:
------------------------------------------------------------------------
XX XX XX XX XX 这五个是我标识的文件开头
------------------------------------------------------------------------
AA AA AA AA 这4个字节是我藏的地址
比如 00 00 01 02
那么我要写入另外一个文件的地址就是 $00000102.,所以编写时没有使用integer
------------------------------------------------------------------------
BB BB 从地址AAAAAAAA开始需要连续写入的数量
比如 03 04
那么我要写入另外一个文件的长度就是 $0304.
------------------------------------------------------------------------
CC CC .... 等到 BB BB这个数量后开始读取BBBB个长度的数组
------------------------------------------------------------------------
.... 然后在循环继续上面三步
------------------------------------------------------------------------
ZZ ZZ ZZ ZZ 我标识的文件结尾
------------------------------------------------------------------------
下面是我的代码:
代码:
function Hex2Int(HexStr: string): int64;
var
RetVar: Int64;
i: byte;
begin
HexStr := UpperCase(HexStr);
if HexStr[length(HexStr)] = 'H' then
Delete(HexStr, length(HexStr), 1);
RetVar := 0;
for i := 1 to length(HexStr) do
begin
RetVar := RetVar shl 4;
if HexStr[i] in ['0'..'9'] then
RetVar := RetVar + (byte(HexStr[i]) - 48)
else if HexStr[i] in ['A'..'F'] then
RetVar := RetVar + (byte(HexStr[i]) - 55)
else
begin
Retvar := 0;
break;
end;
end;
Result := RetVar;
end;
procedure TForm1.ApplyIPS(ips_file, bin_file: string);
var
length, addr, k: integer;
ips, bin: TFileStream;
t: dword;
PATCH: array[0..4] of char;
temp: string;
a_temp, count: array[0..3] of byte;
buf: array[0..65535] of Byte;
begin
ips := TFileStream.Create(ips_file, fmOpenRead);
ips.Read(PATCH, 5);
bin := TFileStream.Create(bin_file, fmOpenReadWrite);
if PATCH = 'AAAAAA' then begin //我文件开始的标识符AA AA AA AA AA 5个字节
t := GetTickCount;
while ips.Position < ips.Size - 3 do //读到文件文件最后 ZZ ZZ ZZ ZZ标识符前
begin
ips.Read(a_temp, 4);
//这里我不想直接使用integer,
temp := IntToHex(a_temp[0], 2) + IntToHex(a_temp[1], 2) +
IntToHex(a_temp[2], 2) + IntToHex(a_temp[3], 2);
addr := Hex2Int(temp);
ips.Read(count, 2);
length := Hex2Int(IntToHex(count[0], 2) + IntToHex(count[1], 2));
ips.Read(buf, length);
bin.Seek(addr, soFromBeginning);
bin.Write(buf, length);
end;
Form1.caption := '用时:' + inttoStr((GetTickCount - t)) + ' ms';
end else Form1.Caption :='错误';
bin.Free;
ips.Free;
end;