LHA
(→Compression schemes) |
|||
Line 7: | Line 7: | ||
|released=1988 | |released=1988 | ||
}} | }} | ||
− | '''LHA''' is an archiving program and file format created by Haruyasu Yoshizaki 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. | + | '''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|LZH disambiguation page]] for other "LZH" formats. | The file format is also known as '''LZH'''. See the [[LZH|LZH disambiguation page]] for other "LZH" formats. | ||
Line 28: | Line 32: | ||
|<code>lh0</code> || || Uncompressed | |<code>lh0</code> || || Uncompressed | ||
|- | |- | ||
− | |<code>lh1</code> || || LZ77+Huffman, 4k window, dynamic Huffman for codes (a code can be a literal or a length, depending on its value) | + | |<code>lh1</code> || || LZ77+Huffman, 4k window, dynamic Huffman for codes (a code can be a literal or a length, depending on its value), offsets use a hard-coded Huffman-like encoding. |
|- | |- | ||
|<code>lh2</code> || ||rowspan="2"| (Not in use?) | |<code>lh2</code> || ||rowspan="2"| (Not in use?) | ||
Line 110: | Line 114: | ||
* [http://apple2.org.za/gswv/a2zine/GS.WorldView/Resources/The.MacShrinkIt.Project/ARCHIVES.TXT Archive format info] | * [http://apple2.org.za/gswv/a2zine/GS.WorldView/Resources/The.MacShrinkIt.Project/ARCHIVES.TXT Archive format info] | ||
* [http://www.textfiles.com/programming/FORMATS/arc_fmts.txt LZH file header format (among other archive types)] | * [http://www.textfiles.com/programming/FORMATS/arc_fmts.txt LZH file header format (among other archive types)] | ||
+ | * [http://www33146ue.sakura.ne.jp/staff/iz/formats/lzh.html LZH format] | ||
+ | * [https://hwiegman.home.xs4all.nl/fileformats/lzh/lzhformat.html LZH format] (Aeco Systems) | ||
* [https://github.com/libarchive/libarchive/blob/master/libarchive/archive_read_support_format_lha.c libarchive: archive_read_support_format_lha.c] - Has comments with information about the header formats | * [https://github.com/libarchive/libarchive/blob/master/libarchive/archive_read_support_format_lha.c libarchive: archive_read_support_format_lha.c] - Has comments with information about the header formats | ||
Line 118: | Line 124: | ||
* [https://web.archive.org/web/20130906133859/http://homepage1.nifty.com/dangan/en/Content/Program/Java/jLHA/jLHA.html Java library] (from archive.org) | * [https://web.archive.org/web/20130906133859/http://homepage1.nifty.com/dangan/en/Content/Program/Java/jLHA/jLHA.html Java library] (from archive.org) | ||
* [https://www.libarchive.org libarchive] | * [https://www.libarchive.org libarchive] | ||
− | * LHarc/LHA | + | * LHarc/LHA |
− | ** {{CdTextfiles|hof91/ARC/LH113C.EXE|LHarc v1.13c}} (1989-05-31) - English | + | ** For DOS |
− | ** {{CdTextfiles|simtel/simtel20/MSDOS/ARCHIVRS/LHA213.EXE|LHA v2.13}} (1991-07-20) - English | + | *** {{CdTextfiles|hof91/ARC/LH113C.EXE|LHarc v1.13c}} (1989-05-31) - English |
− | ** {{CdTextfiles|simtel/simtel9703/disk2/DISC2/ARCERS/LHA255E.EXE|LHA v2.55 English translation}} (1992-11-15) - (unofficial?) | + | *** {{CdTextfiles|simtel/simtel20/MSDOS/ARCHIVRS/LHA213.EXE|LHA v2.13}} (1991-07-20) - English |
− | ** {{CdTextfiles|pdos9606/ARCHIVER/TOOLS/LHA255B.EXE|LHA v2.55b}} (1992-11-24) - Japanese (LHA.EXE) and English (LHA_E.EXE) | + | *** {{CdTextfiles|simtel/simtel9703/disk2/DISC2/ARCERS/LHA255E.EXE|LHA v2.55 English translation}} (1992-11-15) - (unofficial?) |
− | ** [http://info.elf.stuba.sk/packages/pub/pc/pack/lha266.exe LHA v2.66 test version] (1994-12-30) - Japanese | + | *** {{CdTextfiles|pdos9606/ARCHIVER/TOOLS/LHA255B.EXE|LHA v2.55b}} (1992-11-24) - Japanese (LHA.EXE) and English (LHA_E.EXE) |
− | * | + | *** [http://info.elf.stuba.sk/packages/pub/pc/pack/lha266.exe LHA v2.66 test version] (1994-12-30) - Japanese |
+ | ** For Windows console | ||
+ | *** [http://info.elf.stuba.sk/packages/pub/pc/pack/lha267.exe LHA v2.67 test version] (1995-10-07) - Japanese | ||
+ | ** Source code | ||
+ | *** {{CdTextfiles|simtel/simtel20/MSDOS/ARCHIVRS/LHARCSRC.ZIP|v1.13b}} | ||
+ | *** {{CdTextfiles|simtel/simtel20/MSDOS/ARCHIVRS/LHA211SR.ZIP|v2.11}} | ||
* [http://www.manmrk.net/tutorials/compress/downloads/larc333.exe LArc v3.33] (May 19, 1989) (DOS software) | * [http://www.manmrk.net/tutorials/compress/downloads/larc333.exe LArc v3.33] (May 19, 1989) (DOS software) | ||
* {{Deark}} (might be useful for analysis; doesn't decompress the format) | * {{Deark}} (might be useful for analysis; doesn't decompress the format) |
Revision as of 11:46, 26 May 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.
Contents |
Format details
An LHA file consists of a sequence of elements, each representing a member file or directory. There is no global archive-level header.
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 format of an element is determined by the byte at offset 20 from the beginning of that element. It is possible for different formats to be used in the same LHA file.
The formats are similar, but irritatingly different. They don't even follow the same principles with respect to how they must be parsed.
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, dynamic Huffman for codes (a code can be a literal or a length, depending on its value), offsets use a hard-coded Huffman-like encoding. | |
lh2 |
(Not in use?) | |
lh3
| ||
lh4 |
Like lh5, but 4k window | |
lh5 |
LZ77+Huffman, 8k window, static Huffman for codes and offsets | |
lh6 |
Like lh5, but 32k window | |
lh7 |
Like lh5, but 64k window | |
lh8 |
Joe Jared extensions | |
lh9 |
||
lha |
||
lhb |
||
lhc |
||
lhd |
Special | Not a compression scheme. Indicates that the element represents a subdirectory. |
lhe |
Joe Jared extensions | |
lhx |
UNLHA32 extension | |
lz2 |
LArc extensions | |
lz3 |
||
lz4 |
Uncompressed | |
lz5 |
||
lz7 |
||
lz8 |
||
lzs |
||
pc1 |
PMarc extensions | Refer to PMA. |
pm0
| ||
pm1
| ||
pm2
| ||
pms
|
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'
.
See also
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
- 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 (May 19, 1989) (DOS software)
- Deark (might be useful for analysis; doesn't decompress the format)
Sample files
- libarchive test files → test_read_format_lha_*.lzh.uu
- aminet