LZH format

Byte Order: Little-endian
There are some types of LZH header, level-0, level-1, and level-2.
level-0
+------------+
| LZH header |
+------------+
| compressed |
| data       |
+------------+
| LZH header |
+------------+
| compressed |
| data       |
+------------+
...

level-1, level-2
+------------+
| LZH header |
+------------+
| extension  |
| header     |
+------------+
| extension  |
| header     |
+------------+
| ...        |
+------------+
| compressed |
| data       |
+------------+
| LZH header |
+------------+
| extension  |
| header     |
+------------+
| extension  |
| header     |
+------------+
| ...        |
+------------+
| compressed |
| data       |
+------------+
...
level-0
Offset   Length   Contents
  0      1 byte   Size of archived file header (h)
  1      1 byte   Header checksum
  2      5 bytes  Method ID
  7      4 bytes  Compressed size (n)
 11      4 bytes  Uncompressed size
 15      4 bytes  Original file date/time (Generic time stamp)
 19      1 byte   File attribute
 20      1 byte   Level (0x00)
 21      1 byte   Filename / path length in bytes (f)
 22     (f)bytes  Filename / path
 22+(f)  2 bytes  CRC-16 of original file
 24+(f) (n)bytes  Compressed data


level-1
Offset   Length   Contents
  0      1 byte   Size of archived file header (h)
  1      1 byte   Header checksum
  2      5 bytes  Method ID
  7      4 bytes  Compressed size (n)
 11      4 bytes  Uncompressed size
 15      4 bytes  Original file date/time (Generic time stamp)
 19      1 byte   0x20
 20      1 byte   Level (0x01)
 21      1 byte   Filename / path length in bytes (f)
 22     (f)bytes  Filename / path
 22+(f)  2 bytes  CRC-16 of original file
 24+(f)  1 byte   OS ID
 25+(f)  2 bytes  Next header size(x) (0 means no extension header)
[ // Extension headers
         1 byte   Extension type
     (x)-3 bytes  Extension fields
         2 bytes  Next header size(x) (0 means no next extension header)
]*
        (n)bytes  Compressed data


level-2
Offset   Length   Contents
  0      2 byte   Total size of archived file header (h)
  2      5 bytes  Method ID
  7      4 bytes  Compressed size (n)
 11      4 bytes  Uncompressed size
 15      4 bytes  Original file time stamp(UNIX type, seconds since 1970)
 19      1 byte   Reserved
 20      1 byte   Level (0x02)
 21      2 bytes  CRC-16 of original file
 23      1 byte   OS ID
 24      2 bytes  Next header size(x) (0 means no extension header)
[
         1 byte   Extension type
     (x)-3 bytes  Extension fields
         2 bytes  Next header size(x) (0 means no next extension header)
]*
        (n)bytes  Compressed data

Extension header
Common header:
         1 byte   Extension type (0x00)
         2 bytes  CRC-16 of header 
        [1 bytes  Information] (Optional)
         2 bytes  Next header size

File name header:
         1 byte   Extension type (0x01)
         ? bytes  File name
         2 bytes  Next header size

Directory name header:
         1 byte   Extension type (0x02)
         ? bytes  Directory name
         2 bytes  Next header size

Comment header:
         1 byte   Extension type (0x3f)
         ? bytes  Comments
         2 bytes  Next header size

UNIX file permission:
         1 byte   Extension type (0x50)
         2 bytes  Permission value
         2 bytes  Next header size

UNIX file group/user ID:
         1 byte   Extension type (0x51)
         2 bytes  Group ID
         2 bytes  User ID
         2 bytes  Next header size

UNIX file group name:
         1 byte   Extension type (0x52)
         ? bytes  Group name
         2 bytes  Next header size

UNIX file user name:
         1 byte   Extension type (0x53)
         ? bytes  User name
         2 bytes  Next header size

UNIX file last modified time:
         1 byte   Extension type (0x54)
         4 bytes  Last modified time in UNIX time
         2 bytes  Next header size
Method ID
"-lh0-"No compression
"-lh1-"4k sliding dictionary(max 60 bytes) + dynamic Huffman + fixed encoding of position
"-lh2-"8k sliding dictionary(max 256 bytes) + dynamic Huffman (Obsoleted)
"-lh3-"8k sliding dictionary(max 256 bytes) + static Huffman (Obsoleted)
"-lh4-"4k sliding dictionary(max 256 bytes) + static Huffman + improved encoding of position and trees
"-lh5-"8k sliding dictionary(max 256 bytes) + static Huffman + improved encoding of position and trees
"-lzs-"2k sliding dictionary(max 17 bytes)
"-lz4-"No compression
"-lh6-"32k sliding dictionary(max 256 bytes) + static Huffman + improved encoding of position and trees
"-lh7-"64k sliding dictionary + static Huffman
"-lhd-"Directory (no compressed data)

Generic time stamp:
 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
|<------ year ------>|<- month ->|<---- day --->|

 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
|<--- hour --->|<---- minute --->|<- second/2 ->|

Offset   Length   Contents
 0       7 bits   year     years since 1980
 7       4 bits   month    [1..12]
11       5 bits   day      [1..31]
16       5 bits   hour     [0..23]
21       6 bits   minite   [0..59]
27       5 bits   second/2 [0..29]

OS ID
'M'MS-DOS
'2'OS/2
'9'OS9
'K'OS/68K
'3'OS/386
'H'HUMAN
'U'UNIX
'C'CP/M
'F'FLEX
'm'Mac
'R'Runser