首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修改打开的文件并保存它

修改打开的文件并保存它
EN

Stack Overflow用户
提问于 2015-07-01 16:21:27
回答 1查看 128关注 0票数 1

我的程序处理一些存储在7z/ZIP文件中的文件。但是,有些7z/ZIP文件修改了头文件,因此在提取之前必须将它们更改为有效的头文件。

修改后的标头总是相同的,因此它包含在一个const变量中(以及一个有效的):

代码语言:javascript
复制
to_fix := 1629246124;
PKZip := 1347093252;

替换解决方案非常容易,我希望我已经以正确的方式完成了:

代码语言:javascript
复制
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而不是50 4b 03 04

我尝试了以下几点:

代码语言:javascript
复制
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(我打赌问题是由于这个原因)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-01 16:31:08

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

让我们假设您将1347093252写成32位整数,在十六进制中它是$504b0304。您的机器是小终端,因此字节是按相反顺序写的。

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

但是,如果您真的想按照特定的顺序写出4个字节,那么就这样做。例如,与其将$04034b50写成一个小的endian 32位整数,不如写:

代码语言:javascript
复制
const 
  Header: array [0..3] of Byte = ($50, $4b, $03, $04);

这是最干净的方法。

这里显然有一定程度的混乱。停止将值视为整数,而将其视为字节数组。这消除了图片中的痴情。然后计算出您需要编写的4个字节,将它们放在一个数组中,然后编写它们。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31166772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档