/// <summary>
        /// Deserializes the TSM from the C-DEngine binary format
        /// This is not used for the HTTP channel but reserverd for future use on other TCP/UPD channels
        /// </summary>
        /// <param name="pInBuffer"></param>
        /// <param name="pOffset"></param>
        /// <returns></returns>
        internal static TSM FromPacketBytes(byte[] pInBuffer, int pOffset)
        {
            int numberOfDataEntries = 0;

            byte[] dataBytes = null;
            TSM    tNewTSM   = new TSM(); //Save not to write ORG or SID

            using (MemoryStream byteStream = new MemoryStream(pInBuffer, pOffset, pInBuffer.Length - pOffset))
            {
                int packetSize = (byteStream.ReadByte() << 0);
                packetSize |= (byteStream.ReadByte() << 8);
                packetSize |= (byteStream.ReadByte() << 16);
                packetSize |= (byteStream.ReadByte() << 24);
                if (packetSize != pInBuffer.Length)
                {
                    throw new InvalidOperationException("Invalid packet size");
                }

                long timeBinary = byteStream.ReadByte();
                timeBinary |= ((long)byteStream.ReadByte()) << 8;
                timeBinary |= ((long)byteStream.ReadByte()) << 16;
                timeBinary |= ((long)byteStream.ReadByte()) << 24;
                timeBinary |= ((long)byteStream.ReadByte()) << 32;
                timeBinary |= ((long)byteStream.ReadByte()) << 40;
                timeBinary |= ((long)byteStream.ReadByte()) << 48;
                timeBinary |= ((long)byteStream.ReadByte()) << 56;

                int timeOffsetInMinutes = (byteStream.ReadByte() << 0);
                timeOffsetInMinutes |= (byteStream.ReadByte() << 8);

                tNewTSM.TIM = new DateTimeOffset(DateTime.FromFileTime(timeBinary), new TimeSpan(0, timeOffsetInMinutes, 0));

                tNewTSM.LVL         = (eMsgLevel)byteStream.ReadByte();
                tNewTSM.FLG         = (ushort)(((ushort)byteStream.ReadByte()) << 8);
                tNewTSM.FLG        += (ushort)byteStream.ReadByte();
                tNewTSM.QDX        += byteStream.ReadByte();
                numberOfDataEntries = byteStream.ReadByte();
                int PLBlength = byteStream.ReadByte();
                PLBlength += byteStream.ReadByte() << 8;
                PLBlength += byteStream.ReadByte() << 16;
                PLBlength += byteStream.ReadByte() << 24;
                dataBytes  = new byte[packetSize - (21 + PLBlength + pOffset)];
                byteStream.Read(dataBytes, 0, dataBytes.Length);

                if (PLBlength > 0)
                {
                    tNewTSM.PLB = new byte[PLBlength];
                    byteStream.Read(tNewTSM.PLB, 0, PLBlength);
                }
            }

            int byteIndex = 0;

            for (int n = 0; n < numberOfDataEntries; n++)
            {
                //int dataStringLength = BitConverter.ToInt32(dataBytes, byteIndex);
                int dataStringLength = (dataBytes[byteIndex] << 0);
                dataStringLength |= (dataBytes[byteIndex + 1] << 8);
                dataStringLength |= (dataBytes[byteIndex + 2] << 16);
                dataStringLength |= (dataBytes[byteIndex + 3] << 24);
                byteIndex        += 4;

                string dataString = TheCommonUtils.CArray2UTF8String(dataBytes, byteIndex, dataStringLength);
                byteIndex += dataStringLength;

                switch (n)
                {
                case 0: tNewTSM.TXT = dataString; break;

                case 1: tNewTSM.PLS = dataString; break;

                case 2: tNewTSM.ORG = dataString; break;    //ORG-OK

                case 3: tNewTSM.ENG = dataString; break;

                case 4: tNewTSM.FID = dataString; break;

                case 5: tNewTSM.SID = dataString; break;

                case 6: tNewTSM.SEID = dataString; break;

                case 7: tNewTSM.UID = dataString; break;

                case 8: tNewTSM.CST = dataString; break;

                case 9: tNewTSM.OWN = dataString; break;
                }
            }
            return(tNewTSM);
        }