/// <summary>
        /// Decode segment data to an array of server Pdus
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static RdpegfxPdu[] Decode(byte[] data)
        {
            RDP_SEGMENTED_DATA segData = new RDP_SEGMENTED_DATA();
            bool fResult = PduMarshaler.Unmarshal(data, segData);

            if (fResult)
            {
                if (segData.descriptor == DescriptorTypes.SINGLE)
                {
                    byte[] rawData = Compressor.Decompress(segData.bulkData.data, segData.bulkData.header);;


                    return(DecodePdus(rawData));
                }
                else
                {
                    List <byte>        dataList = new List <byte>();
                    byte[]             rawData  = null;
                    RDP_DATA_SEGMENT[] dataSegs = segData.segmentArray;
                    for (int i = 0; i < dataSegs.Length; i++)
                    {
                        RDP8_BULK_ENCODED_DATA bulkData = dataSegs[i].bulkData;
                        rawData = Compressor.Decompress(bulkData.data, bulkData.header);
                        dataList.AddRange(rawData);
                    }

                    if (segData.uncompressedSize == dataList.Count)
                    {
                        return(DecodePdus(dataList.ToArray()));
                    }
                }
            }

            return(null);
        }
        private const uint SEGMENT_PART_SIZE = 65535; // Maximum number of uncompressed bytes in a single segment is 65535
        #endregion private variable

        /// <summary>
        /// Contructor.
        /// </summary>
        /// <param name="descType"> Indicates if a single or multipart segment PDU.</param>
        /// <param name="compFlag">Indicates the data is compressed and the compress type.</param>
        public RdpSegmentedPdu(byte compFlag)
        {
            // segHeader.descType = descType;
            compressFlag = compFlag;
            // default number of uncompressed bytes in a single segment is 65535.
            segmentPartSize = SEGMENT_PART_SIZE;

            segHeadList = new List <RDP_SEGMENTED_DATA>();
            segPduList  = new List <byte[]>();

            segHeader = new RDP_SEGMENTED_DATA();
        }