59 lines
2.6 KiB
Plaintext
59 lines
2.6 KiB
Plaintext
Dave Johnson
|
|
Brown University Computer Science
|
|
ddj%brown@csnet-relay.ARPA
|
|
{ihnp4,decvax,allegra,ulysses,linus}!brunix!ddj
|
|
|
|
===================
|
|
Here's an informal description of the HQX format as I understand it:
|
|
-----
|
|
The first and last characters are each a ':'. After the first ':',
|
|
the rest of the file is just string of 6 bit encoded characters.
|
|
All newlines and carriage returns are to be ignored.
|
|
|
|
The tricky part is that there are holes in the translation string
|
|
so you have to look up each file character to get its binary 6 bit
|
|
value. I found the string by looking at a hex dump of BinHex:
|
|
|
|
!"#$%&'()*+,-012345689@ABCDEFGHIJKLMNPQRSTUVXYZ[`abcdefhijklmpqr
|
|
|
|
I can't see how this aids or abets any kind of error recovery, but
|
|
if you ran into a char not in the list, you would know something's
|
|
wrong and give up.
|
|
|
|
There is some run length encoding, where the character to be repeated
|
|
is followed by a 0x90 byte then the repeat count. For example, ff9004
|
|
means repeat 0xff 4 times. The special case of a repeat count of zero
|
|
means it's not a run, but a literal 0x90. 2b9000 => 2b90.
|
|
|
|
*** Note: the 9000 can be followed by a run, which means to repeat the
|
|
0x90 (not the character previous to that). That is, 2090009003 means
|
|
a 0x20 followed by 3 0x90's.
|
|
|
|
Once you've turned the 6 bit chars into 8, you can parse the header.
|
|
The header format consists of a one byte name length, then the mac
|
|
file name, then a null. The rest of the header is 20 bytes long,
|
|
and contains the usual file type, creator/author, file flags, data
|
|
and resource lengths, and the two byte crc value for the header.
|
|
|
|
The data fork and resource fork contents follow in that order.
|
|
There is a two byte file crc at the end of each fork. If a fork
|
|
is empty, there will be no bytes of contents and the checksum
|
|
will be two bytes of zero.
|
|
|
|
So the decoded data between the first and last ':' looks like:
|
|
|
|
1 n 4 4 2 4 4 2 (length)
|
|
+-+---------+-+----+----+----+----+----+--+
|
|
|n| name... |0|TYPE|AUTH|FLAG|DLEN|RLEN|HC| (contents)
|
|
+-+---------+-+----+----+----+----+----+--+
|
|
|
|
DLEN 2 (length)
|
|
+--------------------------------------+--+
|
|
| DATA FORK |DC| (contents)
|
|
+--------------------------------------+--+
|
|
|
|
RLEN 2 (length)
|
|
+--------------------------------------+--+
|
|
| RESOURCE FORK |RC| (contents)
|
|
+--------------------------------------+--+
|