Thanks to Dave Dribin for pointing this out.
In http://opensource.apple.com/source/CF/CF-550/CFBinaryPList.c
So really there’s no reason why we can’t have plistlib etc for Ruby/Python/whatever deal with binary plists on non-Mac platforms.
HEADER
magic number ("bplist")
file format version
OBJECT TABLE
variable-sized objects
Object Formats (marker byte followed by additional info in some cases)
null 0000 0000
bool 0000 1000 // false
bool 0000 1001 // true
fill 0000 1111 // fill byte
int 0001 nnnn … // # of bytes is 2^nnnn, big-endian bytes
real 0010 nnnn … // # of bytes is 2^nnnn, big-endian bytes
date 0011 0011 … // 8 byte float follows, big-endian bytes
data 0100 nnnn [int] … // nnnn is number of bytes unless 1111 then int count follows, followed by bytes
string 0101 nnnn [int] … // ASCII string, nnnn is # of chars, else 1111 then int count, then bytes
string 0110 nnnn [int] … // Unicode string, nnnn is # of chars, else 1111 then int count, then big-endian 2-byte uint16_t
0111 xxxx // unused
uid 1000 nnnn … // nnnn+1 is # of bytes
1001 xxxx // unused
array 1010 nnnn [int] objref* // nnnn is count, unless ’1111′, then int count follows
1011 xxxx // unused
set 1100 nnnn [int] objref* // nnnn is count, unless ’1111′, then int count follows
dict 1101 nnnn [int] keyref* objref* // nnnn is count, unless ’1111′, then int count follows
1110 xxxx // unused
1111 xxxx // unused
OFFSET TABLE
list of ints, byte size of which is given in trailer
— these are the byte offsets into the file
— number of these is in the trailer
TRAILER
byte size of offset ints in offset table
byte size of object refs in arrays and dicts
number of offsets in offset table (also is number of objects)
element # in offset table which is top level object
offset table offset
*/