/// <summary>Encodes the given unprintable char codes in the given stream.</summary>
        /// <remarks>Encodes the given unprintable char codes in the given stream.</remarks>
        /// <exception cref="System.IO.IOException"></exception>
        private static void WriteUnprintableCodes(int charOffset, byte[] bytes, ByteUtil.ByteStream
                                                  unprintableCodes, GeneralLegacyIndexCodes.ExtraCodesStream extraCodes)
        {
            // the offset seems to be calculated based on the number of bytes in the
            // "extra codes" part of the entry (even if there are no extra codes bytes
            // actually written in the final entry).
            int unprintCharOffset = charOffset;

            if (extraCodes != null)
            {
                // we need to account for some extra codes which have not been written
                // yet.  additionally, any unprintable bytes added to the beginning of
                // the extra codes are ignored.
                unprintCharOffset = extraCodes.GetLength() + (charOffset - extraCodes.GetNumChars
                                                                  ()) - extraCodes.GetUnprintablePrefixLen();
            }
            // we write a whacky combo of bytes for each unprintable char which
            // includes a funky offset and extra char itself
            int offset = (UNPRINTABLE_COUNT_START + (UNPRINTABLE_COUNT_MULTIPLIER * unprintCharOffset
                                                     )) | UNPRINTABLE_OFFSET_FLAGS;

            // write offset as big-endian short
            unprintableCodes.Write((offset >> 8) & unchecked ((int)(0xFF)));
            unprintableCodes.Write(offset & unchecked ((int)(0xFF)));
            unprintableCodes.Write(UNPRINTABLE_MIDFIX);
            unprintableCodes.Write(bytes);
        }
        /// <summary>Encodes the given extra code info in the given stream.</summary>
        /// <remarks>Encodes the given extra code info in the given stream.</remarks>
        /// <exception cref="System.IO.IOException"></exception>
        private static void WriteExtraCodes(int charOffset, byte[] bytes, byte extraCodeModifier
                                            , GeneralLegacyIndexCodes.ExtraCodesStream extraCodes)
        {
            // we fill in a placeholder value for any chars w/out extra codes
            int numChars = extraCodes.GetNumChars();

            if (numChars < charOffset)
            {
                int fillChars = charOffset - numChars;
                extraCodes.WriteFill(fillChars, INTERNATIONAL_EXTRA_PLACEHOLDER);
                extraCodes.IncrementNumChars(fillChars);
            }
            if (bytes != null)
            {
                // write the actual extra codes and update the number of chars
                extraCodes.Write(bytes);
                extraCodes.IncrementNumChars(1);
            }
            else
            {
                // extra code modifiers modify the existing extra code bytes and do not
                // count as additional extra code chars
                int lastIdx = extraCodes.GetLength() - 1;
                if (lastIdx >= 0)
                {
                    // the extra code modifier is added to the last extra code written
                    byte lastByte = extraCodes.Get(lastIdx);
                    lastByte += extraCodeModifier;
                    extraCodes.Set(lastIdx, lastByte);
                }
                else
                {
                    // there is no previous extra code, add a new code (but keep track of
                    // this "unprintable code" prefix)
                    extraCodes.Write(extraCodeModifier);
                    extraCodes.SetUnprintablePrefixLen(1);
                }
            }
        }