/// <summary>
        /// This method is used to deserialize the ExGuid basic object from the specified byte array and start index.
        /// </summary>
        /// <param name="byteArray">Specify the byte array.</param>
        /// <param name="startIndex">Specify the start index from the byte array.</param>
        /// <returns>Return the length in byte of the ExGuid basic object.</returns>
        protected override int DoDeserializeFromByteArray(byte[] byteArray, int startIndex)
        {
            using (BitReader bitReader = new BitReader(byteArray, startIndex))
            {
                int numberOfContinousZeroBit = 0;
                while (numberOfContinousZeroBit < 8 && bitReader.MoveNext())
                {
                    if (bitReader.Current == false)
                    {
                        numberOfContinousZeroBit++;
                    }
                    else
                    {
                        break;
                    }
                }

                switch (numberOfContinousZeroBit)
                {
                case 2:
                    this.Value = bitReader.ReadUInt32(5);
                    this.GUID  = bitReader.ReadGuid();
                    this.Type  = ExtendedGUID5BitUintType;
                    return(17);

                case 5:
                    this.Value = bitReader.ReadUInt32(10);
                    this.GUID  = bitReader.ReadGuid();
                    this.Type  = ExtendedGUID10BitUintType;
                    return(18);

                case 6:
                    this.Value = bitReader.ReadUInt32(17);
                    this.GUID  = bitReader.ReadGuid();
                    this.Type  = ExtendedGUID17BitUintType;
                    return(19);

                case 7:
                    this.Value = bitReader.ReadUInt32(32);
                    this.GUID  = bitReader.ReadGuid();
                    this.Type  = ExtendedGUID32BitUintType;
                    return(21);

                case 8:
                    this.GUID = Guid.Empty;
                    this.Type = ExtendedGUIDNullType;
                    return(1);

                default:
                    throw new InvalidOperationException("Failed to parse the ExGuid, the type value is unexpected");
                }
            }
        }
 /// <summary>
 /// This method is used to get the compressed size value from the data file signature.
 /// </summary>
 /// <param name="dataFileSignature">Specify the signature of the zip file content.</param>
 /// <returns>Return the compressed size value.</returns>
 private ulong GetCompressedSize(byte[] dataFileSignature)
 {
     using (BitReader reader = new BitReader(dataFileSignature, 0))
     {
         reader.ReadUInt32(32);
         return(reader.ReadUInt64(64));
     }
 }
        /// <summary>
        /// This method is used to deserialize the StreamObjectHeaderEnd16bit basic object from the specified byte array and start index.
        /// </summary>
        /// <param name="byteArray">Specify the byte array.</param>
        /// <param name="startIndex">Specify the start index from the byte array.</param>
        /// <returns>Return the length in byte of the StreamObjectHeaderEnd16bit basic object.</returns>
        protected override int DoDeserializeFromByteArray(byte[] byteArray, int startIndex)
        {
            using (BitReader reader = new BitReader(byteArray, startIndex))
            {
                int headerType = reader.ReadInt32(2);

                if (headerType != 0x3)
                {
                    throw new InvalidOperationException(string.Format("Failed to get the StreamObjectHeaderEnd16bit header type value, expect value {0}, but actual value is {1}", 0x3, headerType));
                }

                uint typeValue = reader.ReadUInt32(14);
                if (!Enum.IsDefined(typeof(StreamObjectTypeHeaderEnd), (int)typeValue))
                {
                    throw new InvalidOperationException(string.Format("Failed to get the StreamObjectHeaderEnd16bit type value, the value {0} is not defined", typeValue));
                }

                this.Type = (StreamObjectTypeHeaderEnd)typeValue;
                return(2);
            }
        }