예제 #1
0
        /// <summary>
        /// Разбирает последовательность байт в объект со значениями из данной последовательности.
        /// В случае неверной структуры, длины или ошибок возвращает значение null.
        /// </summary>
        /// <param name="bytes">Последовательность байт.</param>
        public static CommonPacketFormat Parse(List <byte> bytes)
        {
            CommonPacketFormat commonPacketFormat = new CommonPacketFormat();

            if (bytes == null || bytes.Count <= 2)
            {
                return(null);
            }

            ushort length = (ushort)(bytes[0] | bytes[1] << 8);

            List <byte> itemBytes = bytes.GetRange(2, bytes.Count - 2);

            for (int itemIx = 0; itemIx < length; itemIx++)
            {
                CommonPacketItem item = CommonPacketItem.Parse(itemBytes, out itemBytes);
                commonPacketFormat.Items.Add(item);
            }

            if (itemBytes.Count > 0)
            {
                return(null);
            }

            return(commonPacketFormat);
        }
예제 #2
0
        /// <summary>
        /// Разбирает последовательность байт в объект со значениями из данной последовательности.
        /// В случае неверной структуры, длины или ошибок возвращает значение null.
        /// </summary>
        /// <param name="bytes">Последовательность байт.</param>
        /// <param name="remainBytes">Остаточная последовательность байт.</param>
        /// <returns></returns>
        public static CommonPacketItem Parse(List <byte> bytes, out List <byte> remainBytes)
        {
            CommonPacketItem commonPacketItem = new CommonPacketItem();

            remainBytes = bytes.ToList();

            if (bytes == null)
            {
                return(null);
            }

            if (bytes.Count < 4)
            {
                return(null);
            }

            ushort typeValue = (ushort)(bytes[0] | bytes[1] << 8);

            foreach (CommonPacketItemTypeID typeID in Enum.GetValues(typeof(CommonPacketItemTypeID)))
            {
                if ((uint)typeID == typeValue)
                {
                    commonPacketItem.TypeID = typeID;
                    break;
                }
            }

            ushort length = (ushort)(bytes[2] | bytes[3] << 8);

            if (bytes.Count - 4 < length)
            {
                commonPacketItem.Data = bytes.GetRange(4, bytes.Count - 4);
                remainBytes           = new List <byte>();
                //return null;
            }
            else
            {
                commonPacketItem.Data = bytes.GetRange(4, length);
                remainBytes           = bytes.GetRange(4 + length, bytes.Count - (4 + length));
            }
            return(commonPacketItem);
        }
예제 #3
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="item"></param>
 public void Add(CommonPacketItem item)
 {
     this.Items.Add(item);
 }