home *** CD-ROM | disk | FTP | other *** search
/ Carousel / CAROUSEL.cdr / mactosh / unix / xbin.doc < prev    next >
Text File  |  1985-03-17  |  3KB  |  72 lines

  1. 16-Mar-85 21:47:51-PST,3027;000000000001
  2. Return-Path: <ddj%brown.csnet@csnet-relay.arpa>
  3. Received: from csnet-relay by SUMEX-AIM.ARPA with TCP; Sat 16 Mar 85 21:47:45-PST
  4. Received: from brown by csnet-relay.csnet id ac03516; 17 Mar 85 0:50 EST
  5. Message-Id: <8503170540.AA12727@nancy.CS.Brown.CSNet>
  6. Date:     17 Mar 85 (Sun) 00:40:45 EST
  7. From:     Dave Johnson <ddj%brown.csnet@csnet-relay.arpa>
  8. To:       info-mac@sumex-aim.ARPA
  9. Subject:  Re: Details of Binhex 4.0 HQX Format Wanted
  10.  
  11. I have reverse engineered most of the format, and am planning to
  12. release a new version of xbin.c fairly soon, which will convert
  13. files from binhex.{hex,hcx, and hqx} formats into the form macput
  14. expects.  xbin was developed under 4.2BSD Unix, though it should
  15. be reasonably easy to port to other machines.
  16.  
  17. Here's an informal description of the HQX format as I understand it:
  18. -----
  19. The first and last characters are each a ':'.  After the first ':',
  20. the rest of the file is just string of 6 bit encoded characters.
  21. All newlines and carriage returns are to be ignored.
  22.  
  23. The tricky part is that there are holes in the translation string
  24. so you have to look up each file character to get its binary 6 bit
  25. value.  I found the string by looking at a hex dump of BinHex:
  26.  
  27.     !"#$%&'()*+,-012345689@ABCDEFGHIJKLMNPQRSTUVXYZ[`abcdefhijklmpqr
  28.  
  29. I can't see how this aids or abets any kind of error recovery, but
  30. if you ran into a char not in the list, you would know something's
  31. wrong and give up.
  32.  
  33. There is some run length encoding, where the character to be repeated
  34. is followed by a 0x90 byte then the repeat count.  For example, ff9004
  35. means repeat 0xff 4 times.  The special case of a repeat count of zero
  36. means it's not a run, but a literal 0x90.  2b9000 => 2b90.
  37.  
  38. Once you've turned the 6 bit chars into 8, you can parse the header.
  39. The header format consists of a one byte name length, then the mac
  40. file name, then a null.  The rest of the header is 20 bytes long,
  41. and contains the usual file type, creator/author, file flags, data
  42. and resource lengths, and the two byte crc value for the header.
  43.  
  44. The data fork and resource fork contents follow in that order.
  45. There is a two byte file crc at the end of each fork.  If a fork
  46. is empty, there will be no bytes of contents and the checksum
  47. will be two bytes of zero.
  48.  
  49. So the decoded data between the first and last ':' looks like:
  50.  
  51.      1       n       4    4    2    4    4   2    (length)
  52.     +-+---------+-+----+----+----+----+----+--+
  53.     |n| name... |0|TYPE|AUTH|FLAG|DLEN|RLEN|HC|    (contents)
  54.     +-+---------+-+----+----+----+----+----+--+
  55.  
  56.             DLEN             2    (length)
  57.     +--------------------------------------+--+
  58.     |    DATA FORK               |DC|    (contents)
  59.     +--------------------------------------+--+
  60.  
  61.             RLEN             2    (length)
  62.     +--------------------------------------+--+
  63.     |    RESOURCE FORK               |RC|    (contents)
  64.     +--------------------------------------+--+
  65.  
  66. ------
  67.  
  68.     Dave Johnson
  69.     Brown University Computer Science
  70.     ddj%brown@csnet-relay.arpa
  71.     {ihnp4,ulysses,allegra,linus,decvax}!brunix!ddj
  72.