【问题标题】:Parsing GIF application's extension blocks- how to find block size?解析 GIF 应用程序的扩展块 - 如何找到块大小?
【发布时间】:2014-02-04 18:31:25
【问题描述】:

我正在解析一个 GIF 89a(是的,我需要)文件,但我卡在了应用程序扩展块上。

它们有 13 字节的标头(包括开头的 21 个 FF 0B 字节),然后是一些数据。有多少数据?我怎么知道要读多少?

如果你知道答案,你可以跳过下面的部分,直接告诉我:)

这个page 说:

ApplicationData 包含软件应用程序使用的信息。该字段由一系列子块构成,与纯文本扩展块中的数据相同。"

每个子块都以一个字节开始,该字节指示随后的数据字节数。该字节后面可以有 1 到 255 个数据字节。该字段中可以有任意数量的子块。

这样我可以解析 NETSCAPE 2.0 块:

03 01 00 00 00

所以我在 PHP 中有一个循环:

for (;;)
{
  $size = ord(fread($handle, 1));
  if ($size == 0) break;
  fseek($handle, $size);
}

如果您愿意,也可以在 Delphi 中使用:

while F.Position < F.Size do begin
    F.Read(Size, 1);            // F is TFileStream
    if Size = 0 then break;
    F.Position := F.Position + Size;
  end;

迭代进行:

size = 读取 1 个字节; //大小 = 3;

读取 3 个字节;

size = 读取 1 个字节;

size = 0 所以打破

到目前为止,一切都很好,问题来了:XMP 数据

所以这个块中的字节是这样的(下面的ASCII):

21 FF 0B 58 4D 50 20 44 61 74 61 58 4D 50

!`.XMP 数据XMP

然后进行 ASCII XML 转储:

<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> 

大约 500 个字节。

我显然无法像阅读 NETSCAPE 2.0 块一样阅读它。 它似乎以 00 字节终止。 它应该一直读到 00 字节吗?那么如果在 NETSCAPE 2.0 块上会失败!

GIF 解码器应该如何处理应用程序扩展块?其中有多少数据?

Problematic XMP Data image

【问题讨论】:

    标签: php delphi parsing decode gif


    【解决方案1】:

    好的-NETSCAPE 2.0 块方法可能很好,但它在 XML 上失败了,因为我的文件可能被损坏地读取。

    【讨论】:

    • 我遇到了同样的问题。所以它不是一个损坏的文件。 XMP 部分似乎令人困惑,因为它似乎不遵循子块模式。不过这是故意的。 XMP 部分有一个 258 字节的魔术尾部。无论你从哪里跳到那个部分,你总是会在终止块处结束。有关详细信息,请参阅“XMP 规范第 3 部分”。
    • @Bunny83 非常感谢!
    猜你喜欢
    • 2014-12-08
    • 1970-01-01
    • 2011-09-11
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    相关资源
    最近更新 更多