Macintosh Binary Transfer Format ("MacBinary II") Standard Proposal
These are the new changes to the MacBinary Standard, as generally
agreed upon in the MacBinary II Conference 6/21/87, and as changed
in the followup conference 6/28/87. Revised 7/24/87 to reflect
suggestions and clarifications that came later, and to include
all necessary information needed from the original MacBinary standard
document to implement MacBinary II.
The new standard will be very similar to the original MacBinary standard as described in [MacBinary Standard]. (Reading the original standard is recommended for a full understanding of implementation and philosophy behind the MacBinary I and II formats.) The binary format consists of a 128-byte header containing all the information necessary to reproduce the document's directory entry on the receiving Macintosh; followed by the document's Data Fork (if it has one), padded with nulls to a multiple of 128 bytes (if necessary); followed by the document's Resource Fork (again, padded if necessary). The lengths of these forks (either or both of which may be zero) are contained in the header.
The format of the header for MacBinary II is as follows:
|
Offset |
Length |
Contents |
|
000 |
Byte |
old version number, must be kept at zero for compatibility |
|
001 |
Byte |
Length of filename (must be in the range 1-63) |
|
002 |
1 to 63 Bytes |
filename (only "length" bytes are significant). |
|
065 |
Long Word |
file type (normally expressed as four characters) |
|
069 |
Long Word |
file creator (normally expressed as four characters) |
|
073 |
Byte |
original Finder flags Bit 7 - Locked. Bit 6 - Invisible. Bit 5 - Bundle. Bit 4 - System. Bit 3 - Bozo. Bit 2 - Busy. Bit 1 - Changed. Bit 0 - Inited. |
|
074 |
Byte |
zero fill, must be zero for compatibility |
|
075 |
Word |
file's vertical position within its window. |
|
077 |
Word |
file's horizontal position within its window. |
|
079 |
Word |
file's window or folder ID. |
|
081 |
Byte |
"Protected" flag (in low order bit). |
|
082 |
Byte |
zero fill, must be zero for compatibility |
|
083 |
Long Word |
Data Fork length (bytes, zero if no Data Fork). |
|
087 |
Long Word |
Resource Fork length (bytes, zero if no R.F.). |
|
091 |
Long Word |
File's creation date |
|
095 |
Long Word |
File's "last modified" date. |
|
099 |
Word |
length of Get Info comment to be sent after the resource fork (if implemented, see below). |
|
*101 |
Byte |
Finder Flags, bits 0-7. (Bits 8-15 are already in byte 73) |
|
*116 |
Long Word |
Length of total files when packed files are unpacked. This is only used by programs that pack and unpack on the fly, mimicing a standalone utility such as PackIt. A program that is uploading a single file must zero this location when sending a file. Programs that do not unpack/uncompress files when downloading may ignore this value. |
|
*120 |
Word |
Length of a secondary header. If this is non-zero, skip this many bytes (rounded up to the next multiple of 128). This is for future expansion only, when sending files with MacBinary, this word should be zero. |
|
*122 |
Byte |
Version number of Macbinary II that the uploading program is written for (the version begins at 129) |
|
*123 |
Byte |
Minimum MacBinary II version needed to read this file (start this value at 129 |
|
*124 |
Word |
CRC of previous 124 bytes |
All values are stored in normal 68000 order, with Most Significant Byte appearing first then the file. Any bytes in the header not defined above should be set to zero.
The original MacBinary format was ammended to include the sending of the FCMT (Get Info comment) after the resource fork was sent, if the length for such comment, given in offset 99, is not zero. To the best of our knowledge, no program has implemented this feature, due to Apple's stated position that no program should read or write these comments. The definition remains in MacBinary II, so that should Apple ever provide a documented way of reading and writing these comments, terminal programs will be able to take advantage of this feature.
All Finder flags and information would be uploaded, however,
a downloading program should clear the Finder flag bits of
0 - Set if file/folder is on the desktop (Finder 5.0 and later)
1 - bFOwnAppl (used internally)
8 - Inited (seen by Finder)
9 - Changed (used internally by Finder)
10 - Busy (copied from File System busy bit)
Also, fdLocation and fdFldr should be zeroed
To determine if a header is a valid MacBinary header, check bytes 0 and 74 to be both zero. If they are both zero, either (a) the CRC should match, which means it is a MB II file, or (b) byte 82 is zero, which means it may be a MB I file. (Note that, at the current version level, byte 82 is kept zero to maintain compatibility with MacBinary I. If at some point the MacBinary versions change sufficiently that it is necessary to keep MacBinary I programs from downloading these files, we can change byte 82 to non-zero.)
If the header is a MB II header, the program will check the minimum version byte, to see if it knows enough to decode the file. If the minimum version in the header is greater than the version that the terminal program was written for, it will download the file as pure XModem (creating a "TEXT" file) and notify the user that conversion is needed because the MacBinary version was too high.
If the header does NOT represent a valid MB II header, the
program must at minimum check byte 82 to be zero--if it is not
zero, the file is not a MB I file. It is possible to write a much
more robust routine, by checking the following:
Offsets 101-125, Byte, should all be 0.
Offset 2, Byte, (the length of the file name) should be in
the range of 1-63.
Offsets 83 and 87, Long Word, (the length of the forks) should
be in the range of 0-$007F FFFF.
If any of these tests fail, the file is not a valid MacBinary
file. It may still be desirable to distinguish between text files
and foreign binary files (for stripping line feeds or similar
helpful acts). Some tests that would prove useful include:
A quantity of bytes in the first block with the high bit set
would point to a binary file (though this could be fooled by files
with many extended ascii characters, such as generated by the
option key on a Mac).
A large quantity of zero bytes (nulls) would also point to
a binary file.
This proposal was adopted at two conferences attended by representatives from CompuServe, Delphi and BIX networks, and many terminal software publishers.
A partial list of those participating is:
Peter Olson/ICONtac
Larry Loeb/BIX
Neil Shapiro/Maug
Mark Hagerman
Michael Pester
William Bond
Bill Steinberg
Don Brown
Bill Davis
Jean Hess
Scott Watson
Clay Maeckel
Harry Chesley
Jack Brindle
Raines/BMUG
Harry Conover
Chris Allen/Dreams of the Phoenix