How GIF Encoders Terminate LZW Data Blocks

In the Graphics Interchange Format (GIF) specification, compressed image pixel data is segmented into a series of discrete data sub-blocks rather than stored as a continuous stream. A GIF encoder signals that no further LZW data sub-blocks remain by emitting a dedicated Block Terminator byte with a value of zero (0x00). This article explains the data sub-block structure, how the zero-length terminator operates at the container level, and how it coordinates with the LZW End-of-Information (EOI) code.

The GIF Data Sub-Block Format

Image data inside a GIF file is packed into data sub-blocks immediately following the LZW Minimum Code Size byte. The format requires that each sub-block starts with a 1-byte length field:

An encoder continues packaging output bytes into sequential sub-blocks until the entire compressed image data stream has been flushed.

The Block Terminator

To explicitly signal the end of the sub-block sequence, the encoder appends a sub-block with a length of zero. Because this terminator is defined strictly by a byte count of zero, it consists of a single byte:

0x00

When a GIF decoder encounters a byte count field of 0x00, it immediately recognizes that the image data block has concluded. It does not attempt to read further data bytes for that block and shifts its parsing state to read the next structure in the file, such as a Graphic Control Extension, another Image Descriptor, or the GIF Trailer (0x3B).

Coordination with the LZW End-of-Information (EOI) Code

The Block Terminator functions at the file format (container) level, which is distinct from the LZW compression bitstream itself:

  1. The LZW EOI Code: The encoder first outputs an LZW End-of-Information marker (defined as Clear Code + 1). This is embedded directly within the variable-width bitstream to inform the decompression algorithm that all pixel data has been emitted.
  2. Padding and Flushing: The encoder flushes any remaining bits in its bit-buffer by padding the final byte with zeros, appending this byte into the active sub-block.
  3. Closing Sub-Blocks: Once the active sub-block is written, the encoder emits the final 0x00 byte.

By separating the bitstream's logical end (EOI code) from the physical block boundary marker (0x00), the GIF format allows decoders to cleanly verify both data integrity and stream completion.