LHA
Line 99: | Line 99: | ||
|- | |- | ||
|<code>pms</code> | |<code>pms</code> | ||
+ | |- | ||
+ | |<code>ah0</code> ||rowspan="3"| MAR extensions ||rowspan="3"| Refer to [[Micrognosis Compression Archiver]]. | ||
+ | |- | ||
+ | |<code>ari</code> | ||
+ | |- | ||
+ | |<code>hf0</code> | ||
|} | |} | ||
Line 125: | Line 131: | ||
* [[LHice]] | * [[LHice]] | ||
* [[PUT]] | * [[PUT]] | ||
+ | * [[Micrognosis Compression Archiver]] | ||
Other LHA-like formats to be aware of: | Other LHA-like formats to be aware of: |
Revision as of 16:14, 4 September 2020
LHA is an archiving program and file format created by Haruyasu Yoshizaki (a.k.a. Yoshi) in 1988. It was originally called LHarc, then was briefly LH before settling on LHA. In the 1990s, it was the most popular archiving format on the Amiga platform. It also got some use on the PC platform including in the installers for id Software games such as Doom and Quake, because ZIP compression was inferior until the release of PKZIP 2.0, which brought the formats to parity.
It was particularly popular in Japan. Most of the best information about it is in Japanese.
It supports a number of different compression schemes, most of which use LZ77 combined with Huffman coding.
The file format is also known as LZH. See the LZH disambiguation page for other "LZH" formats.
This article covers the format used by LHarc/LHA, as well as "generalized" LHA format: the same file format, but with other compression schemes. The generalized format was possibly designed by Kazuhiko Miki in 1988 for the LArc software, but confirmation of this is needed. If so, it was soon borrowed by LHarc, with new compression schemes.
Contents |
Format details
File structure
An LHA file consists mainly of a sequence of elements, each representing a member file or directory. The sequence is usually terminated by an end-of-archive marker consisting of a single 0x00 byte (but take care, as level 2 headers could start with 0x00). There is no global archive-level header.
Member format
There are at least four different formats that an element can have. (Note that this is independent of compression schemes.) In LHA jargon, the formats are known as "header levels", and are usually called "header level 0", "... 1", "... 2", and "... 3". The header level is determined by the byte at offset 20 from the beginning of that element.
The header levels are similar, but irritatingly different. They don't even follow the same principles with respect to how they must be parsed.
LZH overview
The LZ77+Huffman schemes work roughly as follows. (This is oversimplified.) There is a codes Huffman tree, and a separate offsets tree. A symbol is read using the codes tree which, depending on its value, represents either a literal byte value, or a length. If it is a length, then an additional symbol is read using the offsets tree. Based on the offset and length, a run of recently-decompressed bytes is repeated.
Compression schemes
The compression scheme of an element is identified by the alphanumeric bytes of its compression method field. Known compression schemes:
ID | Category | Description and remarks |
---|---|---|
lh0 |
Uncompressed | |
lh1 |
LZ77+Huffman, 4k window, adaptive Huffman for codes, offsets use a pre-defined Huffman tree. | |
lh2 |
LZ77+Huffman, 8k window, adaptive Huffman. Considered obsolete. | |
lh3 |
LZ77+Huffman, 8k window, segmented, static Huffman for codes, offsets can use static Huffman or a pre-defined Huffman tree. Considered obsolete. | |
lh4 |
Like lh5, but 4k window | |
lh5 |
LZ77+Huffman, 8k window, segmented, static Huffman | |
lh6 |
Like lh5, but 32k window | |
lh7 |
Like lh5, but 64k window | |
lh7 |
LHARK extension | Refer to LHARK. |
lh8 |
Joe Jared extensions | Like lh5, but 64k window. (Same as lh7.) |
lh9 |
Like lh5, but 128k window. Probably never used. | |
lha |
Like lh5, but 256k window. Probably never used. | |
lhb |
Like lh5, but 512k window. Probably never used. | |
lhc |
Like lh5, but 1M window. Probably never used. | |
lhd |
Special | Not a compression scheme. Indicates that the element represents a subdirectory. |
lhe |
Joe Jared extensions | Like lh5, but 2M window. Probably never used. |
lhx |
UNLHA32 extension | |
lz2 |
LArc methods | |
lz3 |
||
lz4 |
Uncompressed | |
lz5 |
LZ77/LZSS, 4k window. Almost identical to "SZDD" used in MS-DOS installation compression. | |
lz7 |
||
lz8 |
||
lzs |
LZ77/LZSS, 2k window | |
lZ0 |
PUT/GET variants | Refer to PUT. |
lZ1
| ||
lZ5
| ||
pc1 |
PMarc extensions | Refer to PMA. |
pm0
| ||
pm1
| ||
pm2
| ||
pms
| ||
ah0 |
MAR extensions | Refer to Micrognosis Compression Archiver. |
ari
| ||
hf0
|
The Wikipedia article has more information about some of the schemes.
Extended headers
For header levels 1 and higher, each member file has an associated list of "extended headers", similar to ZIP's extensible data fields. Each extended header is tagged with a single byte indicating its type. Extended headers are used to store platform-specific metadata, and to extend the format in other ways.
- List of extended headers (from archive.org)
- libarchive: archive_read_support_format_lha.c (look for "EXT_HEADER_CRC")
Header level 0 supports extended data in a more limited way. It allows for just one set of extended header fields (called the "extended area"), the content of which is determined by the initial one-byte "OS type" field.
- Extended area (from archive.org)
Identification
Bytes '-' 'l' ?? ?? '-'
appear at offset 2. This is not a global file signature, but represents the compression scheme of the first member file of the archive.
If you consider PMA to be a form of LHA, then the second of these bytes can also be 'p'
.
The byte at offset 20 (the header level) has value 0x00 through 0x03. If it is 0x00 or 0x01, the header checksum (the byte at offset 1) can also help identify the format.
See also
Other LHA-like formats to be aware of:
Format documentation
- jLHA software: LHA Notes
- Japanese
- English (translation?) (from archive.org)
- Archive format info
- LZH file header format (among other archive types)
- LZH format
- LZH format (Aeco Systems)
- libarchive: archive_read_support_format_lha.c - Has comments with information about the header formats
Software
- lhasa
- 7-Zip
- Explzh for Windows
- Java library (from archive.org)
- libarchive
- LHa for Unix ยท GitHub project
- LHa for Unix (Tsukao Okamoto) (from archive.org)
- UNLHA32.DLL and LHMelt
- LHarc/LHA
- For DOS
- LHarc v1.13c (1989-05-31) - English
- LHA v2.13 (1991-07-20) - English
- LHA v2.55 English translation (1992-11-15) - (unofficial?)
- LHA v2.55b (1992-11-24) - Japanese (LHA.EXE) and English (LHA_E.EXE)
- LHA v2.66 test version (1994-12-30) - Japanese
- For Windows console
- LHA v2.67 test version (1995-10-07) - Japanese
- Source code
- For DOS
- LArc v3.33 (1989-05-19) (DOS software)
- ar version "002" by Haruhiko Okumura (1990) (DOS binary + source code)
- Deark (might be useful for analysis; doesn't decompress the format)
Sample files
- lhasa test files
- libarchive test files โ test_read_format_lha_*.lzh.uu
- aminet
- http://cd.textfiles.com/hof91/ ...
- https://telparia.com/fileFormatSamples/archive/lha/hexify.lha