【问题标题】:How to decode the application extension block of GIF?如何解码GIF的应用程序扩展块?
【发布时间】:2014-12-08 18:13:12
【问题描述】:

如何解码GIF的应用扩展块?

0000300: 73e7 d639 bdad 10ad 9c08 b5a5 0021 ff0b  s..9.........!..
0000310: 4e45 5453 4341 5045 322e 3003 0100 0000  NETSCAPE2.0.....
0000320: 21f9 0409 1900 f600 2c00 0000 0016 01b7  !.......,.......

这个“

21 ff0b  s..9.........!..
    0000310: 4e45 5453 4341 5045 322e 30

" 是已知的,但什么是 "03 0100 0000"?

【问题讨论】:

    标签: decode gif animated-gif


    【解决方案1】:

    以下描述 GIF Netscape 应用程序扩展,取自 from here

    块长 19 个字节。前 14 个字节属于一般 应用扩展格式,语法见GIF89a Specification, section "26. Application Extension"

    语法

     0  |     0x21      |  Extension Label
        +---------------+
     1  |     0xFF      |  Application Extension Label
        +---------------+
     2  |     0x0B      |  Block Size
        +---------------+
     3  |               | 
        +-             -+
     4  |               | 
        +-             -+
     5  |               | 
        +-             -+
     6  |               | 
        +-  NETSCAPE   -+  Application Identifier (8 bytes)
     7  |               | 
        +-             -+
     8  |               | 
        +-             -+
     9  |               | 
        +-             -+
    10  |               | 
        +---------------+
    11  |               | 
        +-             -+
    12  |      2.0      |  Application Authentication Code (3 bytes)
        +-             -+
    13  |               | 
        +===============+                      --+
    14  |     0x03      |  Sub-block Data Size   |
        +---------------+                        |
    15  |     0x01      |  Sub-block ID          |
        +---------------+                        | Application Data Sub-block
    16  |               |                        |
        +-             -+  Loop Count (2 bytes)  |
    17  |               |                        |
        +===============+                      --+
    18  |     0x00      |  Block Terminator
    

    您已经知道NETSCAPE2.0 之前的数据。下一个字节0x03 告诉我们下一个数据子块的长度,它总是 3 个字节。下面的0x01是子块ID。对于 Netscape 块,只有一个数据子块,ID 为1

    后面的 2 个字节以 little endian 为单位指定循环次数——图像帧应该循环多少次,即 0,0 表示循环永远

    最后一个字节0x00 用于终止数据块。所以当我们遇到一个0x00应该是数据子块长度的地方时,我们知道没有剩余子块了,我们需要停止读取该块。

    【讨论】:

      猜你喜欢
      • 2014-02-04
      • 2011-09-11
      • 1970-01-01
      • 2015-05-23
      • 2016-08-22
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多