【问题标题】:Modify opened file and save it修改打开的文件并保存
【发布时间】:2015-07-02 03:03:12
【问题描述】:

我的程序可以处理一些存储在 7z/ZIP 文件中的文件。然而,一些 7z/ZIP 文件已经修改了标题,因此有必要在提取之前将它们更改为有效的。

修改后的标头始终相同,因此它包含在 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;

我遇到的问题是,每当我以小端或大端顺序将 to_fix 的所有实例替换为 PKZip 时,我总是得到相同的顺序写入文件:04 03 4b 50 而不是 @987654326 @。

我尝试了以下方法:

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(我敢打赌问题是由于这个)。

【问题讨论】:

    标签: delphi header endianness lzma


    【解决方案1】:

    x86 和 x64 处理器都是小端。那不是你的问题。

    假设您将1347093252 写为一个32 位整数,十六进制为$504b0304。你的机器是小端的,所以字节是以相反的顺序写入的。

    相反,如果您写入$04034b50,那么字节将首先写入$50,依此类推。

    但是,如果您真的想按特定顺序写出 4 个字节,那就这样做吧。例如,不要将$04034b50 写为小端序的 32 位整数,而是:

    const 
      Header: array [0..3] of Byte = ($50, $4b, $03, $04);
    

    这是最干净的方法。

    这里显然存在一定程度的混乱。停止将值视为整数,而是将它们视为字节数组。这从图片中删除了字节序。然后计算出你需要写入哪些 4 个字节,将它们放入一个数组中,然后写入它们。

    显然,您需要对从文件中读取的数据应用相同的方法。将其读入数组并比较各个字节。或者,将其读入整数并使用CompareMem 与数组进行比较。

    最后,我没有看到任何证据表明您确实找到了正确的 4 个标头字节。也许您也在修改数据,从而损坏文件。我根本不清楚您是否正确诊断了问题。我建议您在实施解决方案之前确保您有准确的诊断。一旦你有了这个诊断,那么你可能会寻找一种解决方案来避免首先写入错误的标题值。从源头上解决问题。

    【讨论】:

    • 而十六进制的6732475204034b50 :/ 我尝试了所有可能的方法。我尝试了您建议的那个以及颠倒的一个($504b0304),但我总是写错顺序!至于您的编辑,如果我这样做 BlockWrite(F, Header, 4) 我仍然得到错误的顺序。我试图将 BlockWrite 放入 4 次迭代循环中,但它仍然没有工作。我仍然不明白为什么反向和有效值以相同的顺序写入......
    • 也许问题出在我搜索修改标题的方式上?
    • 重新发表评论,这是不可能的。写入字节数组时,字节按数组顺序写入。我建议你需要退后一步,弄清楚到底发生了什么。我相信您正在使用十六进制编辑器进行调试?
    • 关于第二条评论,您可能没有在您认为自己正在写作的地方写作。就我个人而言,我会在这里选择流,但这不应该是真正的问题。您确实需要确定问题所在。至少您现在知道如何写入字节并确定它们的顺序。
    • 我已经扩展了我的答案。我认为你需要退后一步,确保你清楚地理解你的问题。您似乎还没有。目前,您似乎正在寻找银弹。我的直觉告诉我这不会有成效。
    猜你喜欢
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 2015-11-30
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多