【发布时间】: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 解码器应该如何处理应用程序扩展块?其中有多少数据?
【问题讨论】:
标签: php delphi parsing decode gif