2.2.1.3.2 Encoding of Binary Data

During encoding, the EncodedDataHeader (section 2.2.1.3.1) structure and the binary data or Unicode string that follows are treated as a simple array of bits, with the bits of each byte arranged in most significant bit first order. The Key and Length fields of the EncodedDataHeader structure MUST be encoded in big-endian byte order, that is, the most significant byte of each field is encoded first.

 Starting from the most significant bit in the first byte, the six most significant bits are grouped and converted into a 6-bit number. This number is used as an index to an ASCII character in the following encoding table. The encoded result is the ASCII character that is obtained from the table.

 CHAR szSixtyFour[65] = 
    "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz{}";

 In every group of six bits, the bit that occurs first in the array of bits MUST be used as the most significant bit in the 6-bit number. The same algorithm is applied to the remaining two bits in the first byte and the four most significant bits in the second byte; and the process is repeated until all groups of six bits have been encoded. If the total number of bits to be encoded is not a multiple of six, the final group of bits MUST be padded with zero-value bits so that the size of the final group becomes six bits.

Encoded binary data can be decoded by mapping each ASCII character back to six bits by using the following decoding table. If an invalid character is used as an index into the decoding table, the table maps it to the value 0xff. Valid characters map to a value in the range 0x00 to 0x3f.

  
 BYTE bInverseSixtyFour[128] = {
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
     0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
     0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
     0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
     0x21, 0x22, 0x23, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
     0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32,
     0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a,
     0x3b, 0x3c, 0x3d, 0x3e, 0xff, 0x3f, 0xff, 0xff
 };