修改打开的文件并保存
Modify opened file and save it
我的程序可以处理一些存储在 7z/ZIP 文件中的文件。然而,一些 7z/ZIP 文件已经修改 headers 因此在解压之前有必要将它们更改为有效文件。
修改后的 headers 始终相同,因此它包含在一个 const 变量中(连同有效变量):
to_fix := 1629246124;
PKZip := 1347093252;
替换解决方案非常简单,我希望我以正确的方式完成:
for i := 0 to filesize(F) do
begin
if i < filesize(F) - 3 then
BlockRead(F, buf, 4);
if buf = to_fix then
begin
Seek(F, i);
BlockWrite(F, PKZip, 4);
end;
buf := 0;
Seek(F, i+1);
end;
我遇到的问题是,每当我以小顺序或 big-endian 顺序将 to_fix
的所有实例替换为 PKZip
时,我总是将相同的顺序写入文件: 04 03 4b 50
而不是 50 4b 03 04
.
我尝试了以下方法:
const PKZip_B1: array[0..3] of byte = (4,3,75,80);
const PKZip_B2: array[0..3] of byte = (80,75,3,4);
const PKZip_I1 = 67324752; //04 03 4b 50 to decimal
const PKZip_I2 = 1347093252; //50 4b 03 04 to decimal
以上所有变体都以错误的顺序替换。
为什么会这样?我在 64 位处理器上使用 Delphi 7(我敢打赌问题是由于这个)。
x86 和 x64 处理器都是小端。那不是你的问题。
假设您将 1347093252
写为 32 位整数,十六进制为 4b0304
。您的机器是小端字节序,因此字节以相反的顺序写入。
相反,如果您写入 034b50
,则字节将首先写入 </code>,依此类推。 </p>
<p>但是,如果您真的想按特定顺序写出 4 个字节,就这样做吧。例如,不要将 <code>034b50
写成 little endian 32 位整数,而是写:
const
Header: array [0..3] of Byte = (, b, , );
这是最干净的方法。
这里显然存在一定程度的混乱。停止将值视为整数,而是将它们视为字节数组。这从图片中删除了字节顺序。然后算出自己需要写的是哪4个字节,放到一个数组里,写进去。
很明显,您需要对从文件中读取的数据应用相同的方法。将其读入数组并比较各个字节。或者,将其读入一个整数并使用 CompareMem
与数组进行比较。
最后,我没有看到任何证据表明您确实找到了正确的 4 header 字节。也许您也在修改数据,因此损坏了文件。我一点也不清楚你是否正确诊断了问题。我建议您在实施解决方案之前确保您有准确的诊断。一旦你有了诊断,那么你可能会寻找一种解决方案,首先避免写入错误的 header 值。从源头上解决问题。
我的程序可以处理一些存储在 7z/ZIP 文件中的文件。然而,一些 7z/ZIP 文件已经修改 headers 因此在解压之前有必要将它们更改为有效文件。
修改后的 headers 始终相同,因此它包含在一个 const 变量中(连同有效变量):
to_fix := 1629246124;
PKZip := 1347093252;
替换解决方案非常简单,我希望我以正确的方式完成:
for i := 0 to filesize(F) do
begin
if i < filesize(F) - 3 then
BlockRead(F, buf, 4);
if buf = to_fix then
begin
Seek(F, i);
BlockWrite(F, PKZip, 4);
end;
buf := 0;
Seek(F, i+1);
end;
我遇到的问题是,每当我以小顺序或 big-endian 顺序将 to_fix
的所有实例替换为 PKZip
时,我总是将相同的顺序写入文件: 04 03 4b 50
而不是 50 4b 03 04
.
我尝试了以下方法:
const PKZip_B1: array[0..3] of byte = (4,3,75,80);
const PKZip_B2: array[0..3] of byte = (80,75,3,4);
const PKZip_I1 = 67324752; //04 03 4b 50 to decimal
const PKZip_I2 = 1347093252; //50 4b 03 04 to decimal
以上所有变体都以错误的顺序替换。
为什么会这样?我在 64 位处理器上使用 Delphi 7(我敢打赌问题是由于这个)。
x86 和 x64 处理器都是小端。那不是你的问题。
假设您将 1347093252
写为 32 位整数,十六进制为 4b0304
。您的机器是小端字节序,因此字节以相反的顺序写入。
相反,如果您写入 034b50
,则字节将首先写入 </code>,依此类推。 </p>
<p>但是,如果您真的想按特定顺序写出 4 个字节,就这样做吧。例如,不要将 <code>034b50
写成 little endian 32 位整数,而是写:
const
Header: array [0..3] of Byte = (, b, , );
这是最干净的方法。
这里显然存在一定程度的混乱。停止将值视为整数,而是将它们视为字节数组。这从图片中删除了字节顺序。然后算出自己需要写的是哪4个字节,放到一个数组里,写进去。
很明显,您需要对从文件中读取的数据应用相同的方法。将其读入数组并比较各个字节。或者,将其读入一个整数并使用 CompareMem
与数组进行比较。
最后,我没有看到任何证据表明您确实找到了正确的 4 header 字节。也许您也在修改数据,因此损坏了文件。我一点也不清楚你是否正确诊断了问题。我建议您在实施解决方案之前确保您有准确的诊断。一旦你有了诊断,那么你可能会寻找一种解决方案,首先避免写入错误的 header 值。从源头上解决问题。