Compress (software)

Compression shell command based on the LZW compression algorithm

"compress" redirects here. For the cloth used in medicine, see Compress (medical). For other uses, see Compression (disambiguation).

This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.
Find sources: "Compress" software – news · newspapers · books · scholar · JSTOR (June 2012) (Learn how and when to remove this message)

|

compress / uncompress

Original author(s)| Spencer Thomas
Initial release| February 1985; 40 years ago (1985-02)
Operating system| Unix, Unix-like, IBM i
Type| Command
compress .Z

Filename extension|

Internet media type|

application/x-compress

Developed by| Spencer Thomas
Type of format| data compression

`compress` is a shell command for compressing data based on the LZW algorithm.[1] `uncompress` is a companion shell command that restores files to their original state (both content and metadata) from a file created with `compress`.

Although once popular, `compress` has fallen out of favor because it uses the patented LZW algorithm. Its use has been replaced by commands such as `gzip` and `bzip2` that use other algorithms and provide better data compression. Compared to `gzip` at its fastest setting, `compress` is slightly slower at compression, slightly faster at decompression, and has a significantly lower compression ratio.[2] 1.8 MiB of memory is used to compress the Hutter Prize data, slightly more than `gzip` at its slowest setting.[3]

`compress` and `uncompress` have maintained a presence on Unix and BSD systems and have been ported to IBM i.[4]

`compress` was standardized in X/Open CAE Specification in 1994,[5] and further in The Open Group Base Specifications, Issue 6 and 7.[6] Linux Standard Base does not require `compress`.[7]

`compress` is often excluded from the default installation of a Linux distribution but can be installed from a separate package.[8] `compress` is available for FreeBSD, OpenBSD, MINIX, Solaris and AIX.

`compress` is allowed for Point-to-Point Protocol in RFC 1977 and for HTTP/1.1 in RFC 9110, though it is rarely used in modern deployments as the better deflate/gzip is available.

## Use

[edit]

Files compressed by `compress` are typically named with extension ".Z" and therefore sometimes called .Z files. The extension derives from the earlier pack program which used extension ".z".

Most `tar` implementations support compression by piping data through `compress` when given the `-Z` command line option.

`gunzip` can decompress .Z files.[9]

## Algorithm

[edit]

The LZW algorithm used in `compress` was patented by Sperry Research Center in 1983. Terry Welch published an IEEE article on the algorithm in 1984,[10] but failed to note that he had applied for a patent on the algorithm. Spencer Thomas of the University of Utah took this article and implemented `compress` in 1984, without realizing that a patent was pending on the LZW algorithm. The GIF image format also incorporated LZW compression in this way, and Unisys later claimed royalties on implementations of GIF. Joseph M. Orost led the team and worked with Thomas et al. to create the final (4.0) version of `compress` and published it as free software to the net.sources USENET group in 1985. U.S. patent 4,558,302 was granted in 1985 – making `compress` unusable without paying royalties to Sperry Research (which later merged into Unisys).

The US LZW patent expired in 2003, so it is now in the public domain in the United States. Today, all LZW patents worldwide are expired (see Graphics Interchange Format#Unisys and LZW patent enforcement).

As of POSIX.1-2024 `compress` supports the DEFLATE algorithm used in gzip.[11]

## File format

[edit]

The compressed output consists of bit groups. Each bit group consists of codes with fixed amount of bits (9–16). Each group, except the last group, is aligned to the number of bits per code multiplied by 8 and right padded with zeroes. The last group is aligned to 8 bit octets and padded with zeroes. More information can be found at an issue on the ncompress GitHub repository.[12]

Example:

Suppose the output has ten 9-bit codes, five 10-bit codes, and thirteen 11-bit codes. There are three groups to output containing 90 bits, 50 bits, and 143 bits of data.

* First group will be 90 bits of data + 54 zero bits of padding in order to be aligned to 72 bits (9 bits × 8).
* Second group will be 50 bits of data + 30 zero bits of padding in order to be aligned to 80 bits (10 bits × 8).
* Third group will be 143 bits of data + 1 zero bit of padding in order to be aligned to 8 bits (since this is the last group in the output).

The existence of padding bits is actually a bug, as LZW does not require any alignment. This bug existed for more than 35 years and was in the original UNIX compress, ncompress, gzip and the Windows port. All application/x-compress files were created using this bug.

Some `compress` implementations write random bits from uninitialized buffer in paddings. There is no guarantee that the paddings will be zeroes. The decompressor must ignore the values in the paddings for compatibility.

## See also

[edit]

* Image compression
* List of POSIX commands

## References

[edit]

1. ^ Frysinger, Mike. "ncompress: a public domain project". Retrieved 2014-07-30. "Compress is a fast, simple LZW file compressor. Compress does not have the highest compression rate, but it is one of the fastest programs to compress data. Compress is the de facto standard in the UNIX community for compressing files."
2. ^ Gommans, Luc. "compression - What's the difference between gzip and compress?". Unix & Linux Stack Exchange.
3. ^ "Large Text Compression Benchmark". mattmahoney.net. "compress 4.3d...."
4. ^ IBM. "IBM System i Version 7.2 Programming Qshell" (PDF). IBM. Retrieved 2020-09-05.
5. ^ X/Open CAE Specification Commands and Utilities Issue 4, Version 2 (pdf), 1994, opengroup.org
6. ^ `compress` – Shell and Utilities Reference, The Single UNIX Specification, Version 3 from The Open Group
7. ^ Chapter 17. Commands and Utilities in Linux Standard Base Core Specification 5.0.0, linuxfoundation.org
8. ^ ncompress, pkgs.org
9. ^ "GNU Gzip". The GNU Operating System and the Free Software Movement. 2023-02-05. Retrieved 2024-04-03. "gunzip can currently decompress files created by gzip, zip, compress or pack. The detection of the input format is automatic."
10. ^ Welch, Terry A. (1984). "A technique for high performance data compression" (PDF). IEEE Computer. 17 (6): 8–19\. doi:10.1109/MC.1984.1659158. S2CID 2055321.
11. ^ "compress". opengroup. Retrieved 2 November 2024.
12. ^ "compression with 9 bits don't work · Issue #5 · vapier/ncompress". GitHub. Retrieved 2024-09-17.

## External links

[edit]

* `compress`: compress data – Shell and Utilities Reference, The Single UNIX Specification, Version 5 from The Open Group
* `compress(1)` – Version 8 Unix Programmer's Manual
* `compress(1)` – FreeBSD General Commands Manual
* `compress(1)` – OpenBSD General Commands Manual
* `compress(1)` – Solaris 11.4 User Commands Reference Manual
* ncompress \- public domain compress/uncompress implementation for POSIX systems
* compress \- original Unix compress (in a compress'd archive)
* compress \- original Unix compress executable (gzip'd)
* Source Code for compress v4.0 (gzip'd sharchives)
* ZIP File containing a Windows port of the compress utility
* source code to the current version of fcompress.c from compress
* bit groups alignment \- Explanation of bit groups alignment.
* lzws \- New library and CLI, implemented without legacy code.
* ruby-lzws \- Ruby bindings with streaming support.

* v
* t
* e

Data compression software

Archivers with
compression
(comparison)|

| Free and
open-source|

* 7-Zip
* Ark
* Expander
* FreeArc
* GNOME Archive Manager
* Info-ZIP
* KGB Archiver
* PAQ
* pax
* PeaZip
* XAD (decompression only)
* Xarchiver
* Zipeg
* ZPAQ

|

Freeware|

* Filzip
* LHA
* Lhasa (decompression only)
* StuffIt Expander (decompression only)
* The Unarchiver (decompression only)
* TUGZip
* ZipGenius

Commercial|

* ARC
* ALZip
* Archive Utility
* ARJ
* BetterZip
* MacBinary
* PKZIP/SecureZIP
* PowerArchiver
* StuffIt
* WinAce
* WinRAR
* WinZip

Non-archiving
compressors|

| Generic|

* bzip2
* compress
* gzip
* lzip
* lzop
* pack
* rzip
* Snappy
* XZ Utils
* zstd

|

For code|

UPX

Audio
compression
(comparison)|

| Lossy|

* AAC
* Fraunhofer FDK AAC
* Nero AAC Codec
* FAAC
* Helix DNA Producer
* MP3
* l3enc
* LAME
* TooLAME
* libavcodec
* libcelt
* libopus
* libspeex
* Musepack
* libvorbis
* Windows Media Encoder

|

Lossless|

* ALAC
* FLAC
* libavcodec
* Monkey's Audio
* mp4als
* OptimFROG
* Shorten
* WavPack

Video
compression
(comparison)|

| Lossy|

| MPEG-4 ASP|

* 3ivx
* DivX
* Nero Digital
* FFmpeg
* HDX4
* Xvid

|

H.264|

* CoreAVC
* Blu-code
* DivX
* FFmpeg
* Nero Digital
* OpenH264
* QuickTime
* x264

HEVC|

* DivX
* x265

Others|

* CineForm
* Cinepak
* Daala
* DNxHD
* Helix DNA Producer
* Indeo
* libavcodec
* Schrödinger (Dirac)
* SBC
* Sorenson
* VP7
* libtheora
* libvpx
* Windows Media Encoder

Lossless|

* FFV1
* Huffyuv
* Lagarith
* MSU Lossless
* YULS

* See also: compression methods and compression formats

* v
* t
* e

Archive formats

Archiving only|

* ar
* cpio
* shar
* tar
* LBR
* WAD
* WARC

Compressing only|

* Brotli
* bzip2
* compress
* gzip
* Zopfli
* LZMA
* LZ4
* lzip
* lzop
* SQ
* xz
* Zstandard

Archiving
and compressing|

* 7z
* ACE
* ARC
* ARJ
* B1
* Cabinet
* cfs
* cpt
* dar
* DGCA
* .dmg
* .egg
* kgb
* LHA
* lrzip
* LZX
* MPQ
* PEA
* RAR
* rzip
* sit
* sitx
* SQX
* UDA
* Xar
* zoo
* ZIP
* ZPAQ

Software packaging
and distributing|

* apk
* App
* APPX
* deb
* HAP
* ipa
* JAR
* WAR
* Jakarta EE RAR
* EAR
* MSI
* MSIX
* Package (macOS)
* RPM
* XAP
* XBAP

Document packaging
and distributing|

* OEB Package Format
* OEBPS Container Format
* Open Packaging Conventions
* PAQ

* Comparison
* List
* Category

*[v]: View this template
*[t]: Discuss this template
*[e]: Edit this template