Php 解析GIF应用程序';s扩展块-如何查找块大小?

Php 解析GIF应用程序';s扩展块-如何查找块大小?,php,delphi,parsing,decode,gif,Php,Delphi,Parsing,Decode,Gif,我正在解析一个GIF 89a(是的,我需要)文件,我被应用程序扩展块卡住了 它们有13个字节的头(包括开始的21个FF0B字节),然后有一些数据。有多少数据?我怎么知道要读多少书 如果您知道答案,可以跳过下面的部分,只需告诉我:) 上面说: ApplicationData包含软件应用程序使用的信息。此字段在一系列子块中构成,这些子块与纯文本扩展块中的数据相同。” 每个子块都以一个字节开始,该字节指示后面的数据字节数。该字节后面可能有1到255个数据字节。该字段中可能有任意数量的子块 通过这种方式

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

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

如果您知道答案,可以跳过下面的部分,只需告诉我:)

上面说:

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

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

通过这种方式,我可以解析NETSCAPE 2.0块,这些块是:

03 01 00 00

因此,我在PHP中有一个循环:

for (;;)
{
  $size = ord(fread($handle, 1));
  if ($size == 0) break;
  fseek($handle, $size);
}
如果您愿意,也可以使用德尔福:

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;
当F.位置
迭代过程如下:

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

读取3字节

大小=读取1字节

大小=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解码器在应用程序扩展块上应该如何工作?其中有多少数据?


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

我也遇到了同样的问题。因此它不是一个损坏的文件。XMP部分似乎很混乱,因为它似乎没有遵循子块模式。然而,这是故意的。XMP部分有一个神奇的预告片258字节。无论你跳到哪里,你总是会在终止块结束。有关更多信息,请参阅“XMP规范第3部分”。@Bunny83非常感谢!