/// <summary>Commits the object header onto the stream.</summary>
 /// <remarks>
 /// Commits the object header onto the stream.
 /// <p>
 /// Once the header has been written, the object representation must be fully
 /// output, or packing must abort abnormally.
 /// </remarks>
 /// <param name="otp">the object to pack. Header information is obtained.</param>
 /// <param name="rawLength">
 /// number of bytes of the inflated content. For an object that is
 /// in whole object format, this is the same as the object size.
 /// For an object that is in a delta format, this is the size of
 /// the inflated delta instruction stream.
 /// </param>
 /// <exception cref="System.IO.IOException">the underlying stream refused to accept the header.
 ///     </exception>
 public void WriteHeader(ObjectToPack otp, long rawLength)
 {
     if (otp.IsDeltaRepresentation())
     {
         if (packWriter.IsDeltaBaseAsOffset())
         {
             ObjectToPack baseInPack = otp.GetDeltaBase();
             if (baseInPack != null && baseInPack.IsWritten())
             {
                 long start = count;
                 int  n     = EncodeTypeSize(Constants.OBJ_OFS_DELTA, rawLength);
                 Write(headerBuffer, 0, n);
                 long offsetDiff = start - baseInPack.GetOffset();
                 n = headerBuffer.Length - 1;
                 headerBuffer[n] = unchecked ((byte)(offsetDiff & unchecked ((int)(0x7F))));
                 while ((offsetDiff >>= 7) > 0)
                 {
                     headerBuffer[--n] = unchecked ((byte)(unchecked ((int)(0x80)) | (--offsetDiff & unchecked (
                                                                                          (int)(0x7F)))));
                 }
                 Write(headerBuffer, n, headerBuffer.Length - n);
                 return;
             }
         }
         int n_1 = EncodeTypeSize(Constants.OBJ_REF_DELTA, rawLength);
         otp.GetDeltaBaseId().CopyRawTo(headerBuffer, n_1);
         Write(headerBuffer, 0, n_1 + Constants.OBJECT_ID_LENGTH);
     }
     else
     {
         int n = EncodeTypeSize(otp.GetType(), rawLength);
         Write(headerBuffer, 0, n);
     }
 }