# BinHex

BinHex, originally short for "binary-to-hexadecimal", is a binary-to-text encoding system which was used on the classic Mac OS for sending binary files over email. BinHexed files take up more space than the original files, but avoid data corruption by software that is not 8-bit clean.

## History
### TRS-80 BinHex

BinHex was originally written in 1981 by Tim Mann for the TRS-80 computer, as a standalone version of the encoding scheme of the popular terminal emulator ST80-III, for users of other terminals. It was used for sending files via major online services such as CompuServe which, not being 8-bit clean, required files to use ASCII armoring to survive. The system became very popular after Mann uploaded it to CompuServe's TRS-80 files area.
The original scheme converted the binary file contents to hexadecimal numbers, encoding those as ASCII digits and letters (0–9, A–F), and adding a newline after every 60 characters. The system quickly gained the addition of a checksum at the end of every line to check for errors, and a subsequent conversion to use the BASIC/S compiler allowed it to run much faster than the original interpreted version.
BinHex files of the era were typically given the file extension .hex. Ports soon appeared for other popular computers of the era, including the Apple II. When CompuServe later added support for 8-bit transfers, the format fell out of use.

### Mac BinHex

When the Macintosh 128K was released in January 1984, the file upload problem still existed on CompuServe. In April, BinHex was ported to the Mac using MS BASIC for Macintosh. The Macintosh File System had introduced the storage of files as a "resource fork" and "data fork", and the Macintosh port only supported encoding of files' data fork, meaning it could only be used for data files. Several newer versions were published during 1984, resulting in BinHex 3 which could encode both forks.
Yves Lempereur, author of the first assembler for the Mac, MacASM, ported BinHex 3 to assembly language, increasing its speed a hundred-fold, and released it as BinHex 1.0.

### Compact BinHex

The simplicity of the original BinHex format made it inefficient, expanding every byte of input into two, as required by the hexadecimal representation, an 8-to-4 bit encoding. Lempereur implemented a new 8-to-6 bit encoding, which decreased file size by 50% and expanded the checksum from 8 to 16-bits, releasing this as BinHex 2.0.
The new encoding used the first 64 ASCII printing characters, including the space, to represent the data, similarly to uuencoding. As the smaller files were incompatible with the older format, Lempereur changed the file extension to .hcx, with c meaning compact. The name BinHex did not change, despite the format no longer being a hexadecimal representation.

### BinHex 4 and 5

In 1985 Lempereur released BinHex 4.0, skipping 3.0 to avoid confusion with a similarly-numbered version of BASIC. This version performed the following sequence of operations:
* Generate cyclic redundancy checks (CRCs) for the data fork, resource fork, and file metadata, instead of a single checksum
* Combine the forks and metadata with their checksums into a common 8-bit format
* Apply run-length encoding to provide some compression
* Perform the 8-to-6 bit conversion.
The resulting files were roughly the same size as those from BinHex 2, but much more robust, with the metadata information in the header being protected from corruption by no longer being in plain text. The file extension for this new format was .hqx.
At about the same time, most online services had started to support robust 8-bit file transfer protocols such as ZMODEM. This obviated the need for ASCII armoring, but on the Macintosh there was still the need to encode the two forks into one, leading to the development of the MacBinary file format. Lempereur released BinHex 5.0, which only differed by using MacBinary to combine the forks, but it saw little use.

### Internet usage

While the Internet was gaining popularity in the 1990s, email was still the primary method of moving files. Relatively few people had full access, and services like FTPmail were the only way many users could download files. Consequently, binary files still required encoding, and BinHex 4.0 remained a popular tool for doing so into the late 1990s. BinHexed files can still be found today in archives of classic Mac OS software.

## BinHex 4 file format

A BinHex file may begin with any text content, followed by a line which indicates the format of the file, and that binary data is about to begin: (This file must be converted with BinHex 4.0). The text preceding that line is ignored when the file is converted out of BinHex format.
The binary data is encoded to 7-bit ASCII characters, with three bytes of input (24 bits) divided into four 6-bit values, in a similar fashion to Base64 encoding but using a different set of characters. The encoded data has a colon (:) placed before and after it, and is split into lines of a maximum of 64 characters in length.