ReadToEnd() публичный Метод

Read bytes from current position to the end of buffer.
public ReadToEnd ( ) : byte[]
Результат byte[]
        /// <summary>
        /// Deserialized byte array to a Restriction instance
        /// </summary>
        /// <param name="buffer">Byte array contain data of a Restriction instance.</param>
        /// <returns>Bytes count that deserialized in buffer.</returns>
        public override uint Deserialize(byte[] buffer)
        {
            BufferReader bufferReader = new BufferReader(buffer);
            this.RestrictType = (RestrictionType)bufferReader.ReadByte();

            uint size = bufferReader.Position;
            byte[] tmpArray = bufferReader.ReadToEnd();

            RestrictionType restrictionType = (RestrictionType)tmpArray[0];
            switch (restrictionType)
            {
                case RestrictionType.AndRestriction:
                    this.Restriction = new AndRestriction(this.CountType);
                    break;
                case RestrictionType.BitMaskRestriction:
                    this.Restriction = new BitMaskRestriction();
                    break;
                case RestrictionType.CommentRestriction:
                    this.Restriction = new CommentRestriction(this.CountType);
                    break;
                case RestrictionType.ComparePropertiesRestriction:
                    this.Restriction = new ComparePropertiesRestriction();
                    break;
                case RestrictionType.ContentRestriction:
                    this.Restriction = new ContentRestriction();
                    break;
                case RestrictionType.CountRestriction:
                    this.Restriction = new CountRestriction(this.CountType);
                    break;
                case RestrictionType.ExistRestriction:
                    this.Restriction = new ExistRestriction();
                    break;
                case RestrictionType.NotRestriction:
                    this.Restriction = new NotRestriction(this.CountType);
                    break;
                case RestrictionType.OrRestriction:
                    this.Restriction = new OrRestriction(this.CountType);
                    break;
                case RestrictionType.PropertyRestriction:
                    this.Restriction = new PropertyRestriction();
                    break;
                case RestrictionType.SizeRestriction:
                    this.Restriction = new SizeRestriction();
                    break;
                case RestrictionType.SubObjectRestriction:
                    this.Restriction = new SubObjectRestriction(this.CountType);
                    break;
            }

            size += this.Restriction.Deserialize(tmpArray);
            return size;
        }
 /// <summary>
 /// Deserialized byte array to a TagActionData instance
 /// </summary>
 /// <param name="buffer">Byte array contains data of an ActionData instance.</param>
 /// <returns>Bytes count that deserialized in buffer.</returns>
 public uint Deserialize(byte[] buffer)
 {
     BufferReader bufferReader = new BufferReader(buffer);
     PropertyTag propertyTag = new PropertyTag
     {
         PropertyType = bufferReader.ReadUInt16(),
         PropertyId = bufferReader.ReadUInt16()
     };
     this.PropertyTag = propertyTag;
     uint size = bufferReader.Position;
     this.PropertyValue = AdapterHelper.ReadValueByType(this.PropertyTag.PropertyType, bufferReader.ReadToEnd());
     size += (uint)this.PropertyValue.Length;
     return size;
 }
        /// <summary>
        /// Get a TaggedPropertyValue structure from buffer.
        /// </summary>
        /// <param name="buffer">Buffer contain TaggedPropertyValue instance.</param>
        /// <returns>A TaggedPropertyvalue structure.</returns>
        public static TaggedPropertyValue ReadTaggedProperty(byte[] buffer)
        {
            TaggedPropertyValue tagValue = new TaggedPropertyValue();
            BufferReader bufferReader = new BufferReader(buffer);

            PropertyTag newPropertyTag = new PropertyTag
            {
                PropertyType = bufferReader.ReadUInt16(),
                PropertyId = bufferReader.ReadUInt16()
            };
            tagValue.PropertyTag = newPropertyTag;
            tagValue.Value = ReadValueByType(tagValue.PropertyTag.PropertyType, bufferReader.ReadToEnd());

            return tagValue;
        }
        /// <summary>
        /// Deserialized byte array to a Restriction instance
        /// </summary>
        /// <param name="buffer">Byte array contain data of a Restriction instance.</param>
        /// <returns>Bytes count that deserialized in buffer.</returns>
        public override uint Deserialize(byte[] buffer)
        {
            BufferReader reader = new BufferReader(buffer);
            this.RestrictType = (RestrictionType)reader.ReadByte();
            this.TaggedValuesCount = reader.ReadByte();
            this.TaggedValues = new TaggedPropertyValue[this.TaggedValuesCount];
            uint size = reader.Position;
            byte[] tmpArray = reader.ReadToEnd();
            for (int i = 0; i < this.TaggedValuesCount; i++)
            {
                this.TaggedValues[i] = AdapterHelper.ReadTaggedProperty(tmpArray);
                uint tagLength = (uint)this.TaggedValues[i].Size();
                size += tagLength;
                reader = new BufferReader(tmpArray);
                tmpArray = reader.ReadBytes(tagLength, (uint)(tmpArray.Length - tagLength));
            }

            reader = new BufferReader(buffer);
            reader.ReadBytes(size);
            this.RestrictionPresent = reader.ReadByte();
            size += reader.Position;
            tmpArray = reader.ReadToEnd();
            if (this.RestrictionPresent == 0x01)
            {
                RestrictionType restrictionType = (RestrictionType)tmpArray[0];
                switch (restrictionType)
                {
                    case RestrictionType.AndRestriction:
                        this.Restriction = new AndRestriction(CountType);
                        break;
                    case RestrictionType.BitMaskRestriction:
                        this.Restriction = new BitMaskRestriction();
                        break;
                    case RestrictionType.CommentRestriction:
                        this.Restriction = new CommentRestriction(CountType);
                        break;
                    case RestrictionType.ComparePropertiesRestriction:
                        this.Restriction = new ComparePropertiesRestriction();
                        break;
                    case RestrictionType.ContentRestriction:
                        this.Restriction = new ContentRestriction();
                        break;
                    case RestrictionType.CountRestriction:
                        this.Restriction = new CountRestriction(CountType);
                        break;
                    case RestrictionType.ExistRestriction:
                        this.Restriction = new ExistRestriction();
                        break;
                    case RestrictionType.NotRestriction:
                        this.Restriction = new NotRestriction(CountType);
                        break;
                    case RestrictionType.OrRestriction:
                        this.Restriction = new OrRestriction(CountType);
                        break;
                    case RestrictionType.PropertyRestriction:
                        this.Restriction = new PropertyRestriction();
                        break;
                    case RestrictionType.SizeRestriction:
                        this.Restriction = new SizeRestriction();
                        break;
                    case RestrictionType.SubObjectRestriction:
                        this.Restriction = new SubObjectRestriction(CountType);
                        break;
                }

                size += this.Restriction.Deserialize(tmpArray);
            }

            return size;
        }
        /// <summary>
        /// Deserialized byte array to a Restriction instance
        /// </summary>
        /// <param name="buffer">Byte array contain data of a Restriction instance.</param>
        /// <returns>Bytes count that deserialized in buffer.</returns>
        public override uint Deserialize(byte[] buffer)
        {
            BufferReader bufferReader = new BufferReader(buffer);
            this.RestrictType = (RestrictionType)bufferReader.ReadByte();
            this.restrictCount = (this.CountType == CountByte.TwoBytesCount) ? bufferReader.ReadUInt16() : bufferReader.ReadUInt32();
            int count = (this.CountType == CountByte.TwoBytesCount) ? (int)(ushort)this.RestrictCount : (int)(uint)this.RestrictCount;
            this.Restricts = new IRestriction[count];

            uint size = bufferReader.Position;
            byte[] tmpArray = bufferReader.ReadToEnd();
            for (int i = 0; i < count; i++)
            {
                RestrictionType restrictionType = (RestrictionType)tmpArray[0];
                switch (restrictionType)
                {
                    case RestrictionType.AndRestriction:
                        this.Restricts[i] = new AndRestriction(this.CountType);
                        break;
                    case RestrictionType.BitMaskRestriction:
                        this.Restricts[i] = new BitMaskRestriction();
                        break;
                    case RestrictionType.CommentRestriction:
                        this.Restricts[i] = new CommentRestriction(this.CountType);
                        break;
                    case RestrictionType.ComparePropertiesRestriction:
                        this.Restricts[i] = new ComparePropertiesRestriction();
                        break;
                    case RestrictionType.ContentRestriction:
                        this.Restricts[i] = new ContentRestriction();
                        break;
                    case RestrictionType.CountRestriction:
                        this.Restricts[i] = new CountRestriction(this.CountType);
                        break;
                    case RestrictionType.ExistRestriction:
                        this.Restricts[i] = new ExistRestriction();
                        break;
                    case RestrictionType.NotRestriction:
                        this.Restricts[i] = new NotRestriction(this.CountType);
                        break;
                    case RestrictionType.OrRestriction:
                        this.Restricts[i] = new OrRestriction(this.CountType);
                        break;
                    case RestrictionType.PropertyRestriction:
                        this.Restricts[i] = new PropertyRestriction();
                        break;
                    case RestrictionType.SizeRestriction:
                        this.Restricts[i] = new SizeRestriction();
                        break;
                    case RestrictionType.SubObjectRestriction:
                        this.Restricts[i] = new SubObjectRestriction(this.CountType);
                        break;
                }

                uint tmpLength = this.Restricts[i].Deserialize(tmpArray);
                size += tmpLength;
                bufferReader = new BufferReader(tmpArray);
                tmpArray = bufferReader.ReadBytes(tmpLength, (uint)(tmpArray.Length - tmpLength));
            }

            return size;
        }
        /// <summary>
        /// Read a value from buffer for special Type.
        /// </summary>
        /// <param name="type">The Type of value.</param>
        /// <param name="buffer">Buffer contains value.</param>
        /// <returns>Byte array of the value.</returns>
        public static byte[] ReadValueByType(ushort type, byte[] buffer)
        {
            byte[] value = null;
            BufferReader bufferReader = new BufferReader(buffer);

            uint length = 0;
            byte[] tmpArray = null;
            uint startIndex = 0;
            uint endIndex = 0;
            switch (type)
            {
                // 2-byte
                // PtypInteger16
                case 0x0002:
                    value = bufferReader.ReadBytes(2);
                    break;

                // 4-byte
                // PtypInteger32
                case 0x0003:

                // PtypFloating32
                case 0x0004:

                // PtypErrorCode 
                case 0x000A:
                    value = bufferReader.ReadBytes(4);
                    break;

                // 8-byte
                // PtypFloating64
                case 0x0005:

                // PtypCurrency 
                case 0x0006:

                // PtypFloatingTime
                case 0x0007:

                // PtypInteger64
                case 0x0014:

                // PtypTime 
                case 0x0040:
                    value = bufferReader.ReadBytes(8);
                    break;

                // 1 byte
                // PtypBoolean 
                case 0x000B:
                    value = new byte[1] { bufferReader.ReadByte() };
                    break;

                // PtypString PT_UNICODE
                case 0x001F:
                    value = Encoding.Unicode.GetBytes(bufferReader.ReadUnicodeString());
                    break;

                // PtypString8
                case 0x001E:
                    value = Encoding.ASCII.GetBytes(bufferReader.ReadASCIIString());
                    break;

                // 16-byte
                // PtypGuid  16bytes
                case 0x0048:

                // PtypServerId 
                case 0x00FB:
                    value = bufferReader.ReadBytes(16);
                    break;

                // PtypRestriction  
                case 0x00FD:
                    tmpArray = bufferReader.ReadToEnd();
                    IRestriction restriction = null;
                    RestrictionType restrictionType = (RestrictionType)tmpArray[0];
                    switch (restrictionType)
                    {
                        case RestrictionType.AndRestriction:
                            restriction = new AndRestriction();
                            break;
                        case RestrictionType.BitMaskRestriction:
                            restriction = new BitMaskRestriction();
                            break;
                        case RestrictionType.CommentRestriction:
                            restriction = new CommentRestriction();
                            break;
                        case RestrictionType.ComparePropertiesRestriction:
                            restriction = new ComparePropertiesRestriction();
                            break;
                        case RestrictionType.ContentRestriction:
                            restriction = new ContentRestriction();
                            break;
                        case RestrictionType.CountRestriction:
                            restriction = new CountRestriction();
                            break;
                        case RestrictionType.ExistRestriction:
                            restriction = new ExistRestriction();
                            break;
                        case RestrictionType.NotRestriction:
                            restriction = new NotRestriction();
                            break;
                        case RestrictionType.OrRestriction:
                            restriction = new OrRestriction();
                            break;
                        case RestrictionType.PropertyRestriction:
                            restriction = new PropertyRestriction();
                            break;
                        case RestrictionType.SizeRestriction:
                            restriction = new SizeRestriction();
                            break;
                        case RestrictionType.SubObjectRestriction:
                            restriction = new SubObjectRestriction();
                            break;
                    }

                    length += restriction.Deserialize(tmpArray);
                    value = bufferReader.ReadBytes(0, length);
                    break;

                // PtypRuleAction  
                case 0x00FE:
                    tmpArray = bufferReader.ReadToEnd();
                    RuleAction ruleAction = new RuleAction();
                    length = ruleAction.Deserialize(tmpArray);
                    bufferReader = new BufferReader(tmpArray);
                    value = bufferReader.ReadBytes(length);
                    break;

                // PtypBinary  
                case 0x0102:
                    length = (uint)(buffer[bufferReader.Position] + (buffer[bufferReader.Position + 1] << 8) + 2);
                    value = bufferReader.ReadBytes(length);
                    break;

                // PtypMultipleInteger16 
                case 0x1002:
                    length = (uint)(buffer[bufferReader.Position] + (buffer[bufferReader.Position + 1] << 8));
                    length = (length * 2) + 2;
                    value = bufferReader.ReadBytes(length);
                    break;

                // PtypMultipleInteger32  
                case 0x1003:

                // PtypMultipleFloating32  
                case 0x1004:
                    length = (uint)(buffer[bufferReader.Position] + (buffer[bufferReader.Position + 1] << 8));
                    length = (length * 4) + 2;
                    value = bufferReader.ReadBytes(length);
                    break;

                // PtypMultipleFloating64 
                case 0x1005:

                // PtypMultipleCurrency
                case 0x1006:

                // PtypMultipleFloatingTime
                case 0x1007:

                // PtypMultipleInteger64
                case 0x1014:

                // PtypMultipleTime 
                case 0x1040:
                    length = (uint)(buffer[bufferReader.Position] + (buffer[bufferReader.Position + 1] << 8));
                    length = (length * 8) + 2;
                    value = bufferReader.ReadBytes(length);
                    break;

                // PtypMultipleString
                case 0x101F:
                    startIndex = bufferReader.Position;
                    ushort strCount = bufferReader.ReadUInt16();
                    for (int istr = 0; istr < strCount; istr++)
                    {
                        bufferReader.ReadUnicodeString();
                    }

                    endIndex = bufferReader.Position;
                    length = endIndex - startIndex;
                    value = bufferReader.ReadBytes(startIndex, length);
                    break;

                // PtypMultipleString8
                case 0x101E:
                    startIndex = bufferReader.Position;
                    ushort str8Count = bufferReader.ReadUInt16();
                    for (int istr8 = 0; istr8 < str8Count; istr8++)
                    {
                        bufferReader.ReadASCIIString();
                    }

                    endIndex = bufferReader.Position;
                    length = endIndex - startIndex;
                    value = bufferReader.ReadBytes(startIndex, length);
                    break;

                // PtypMultipleGuid
                case 0x1048:
                    length = (uint)(buffer[bufferReader.Position] + (buffer[bufferReader.Position + 1] << 8));
                    length = (length * 16) + 2;
                    value = bufferReader.ReadBytes(length);
                    break;

                // PtypMultipleBinary 
                case 0x1102:
                    startIndex = bufferReader.Position;
                    ushort binCount = bufferReader.ReadUInt16();
                    for (int ibin = 0; ibin < binCount; ibin++)
                    {
                        uint binLength = bufferReader.ReadUInt16();
                        bufferReader.ReadBytes(binLength);
                    }

                    endIndex = bufferReader.Position;
                    length = endIndex - startIndex;
                    value = bufferReader.ReadBytes(startIndex, length);
                    break;

                // PtypUnspecified 
                case 0x0000:
                    throw new NotImplementedException();

                // PtypNull
                case 0x0001:
                    value = null;
                    break;

                // PtypObject or PtypEmbeddedTable 
                case 0x000D:
                    throw new NotImplementedException();
            }

            return value;
        }
        /// <summary>
        /// Parse method to obtain current structure from byte array
        /// </summary>
        /// <param name="buffer">Byte array data.</param>
        /// <returns>Bytes count that deserialized in buffer.</returns>
        public uint Deserialize(byte[] buffer)
        {
            BufferReader bufferReader = new BufferReader(buffer);
            uint count = 0;
            if (this.CountType == CountByte.TwoBytesCount)
            {
                this.NoOfActions = bufferReader.ReadUInt16();
                this.Actions = new ActionBlock[(ushort)this.NoOfActions];
                count = (uint)(ushort)this.NoOfActions;
            }
            else if (this.CountType == CountByte.FourBytesCount)
            {
                this.NoOfActions = bufferReader.ReadUInt32();
                this.Actions = new ActionBlock[(uint)this.NoOfActions];
                count = (uint)this.NoOfActions;
            }

            uint totalBytes = bufferReader.Position;
            byte[] tmpArray = bufferReader.ReadToEnd();
            uint bytesCount = 0;
            for (uint i = 0; i < count; i++)
            {
                bufferReader = new BufferReader(tmpArray);
                tmpArray = bufferReader.ReadBytes(bytesCount, (uint)(tmpArray.Length - bytesCount));
                this.Actions[i] = new ActionBlock(this.CountType);
                bytesCount = this.Actions[i].Deserialize(tmpArray);
                totalBytes += bytesCount;
            }

            return totalBytes;
        }
        /// <summary>
        /// Deserialized byte array to a ForwardActionData instance
        /// </summary>
        /// <param name="buffer">Byte array contains data of an ActionData instance.</param>
        /// <returns>Bytes count that deserialized in buffer.</returns>
        public uint Deserialize(byte[] buffer)
        {
            BufferReader bufferReader = new BufferReader(buffer);
            uint totalBytes = 0;
            uint count = 0;
            if (this.CountType == CountByte.TwoBytesCount)
            {
                this.RecipientCount = bufferReader.ReadUInt16();
                this.RecipientsData = new RecipientBlock[(ushort)this.RecipientCount];
                count = (uint)(ushort)this.RecipientCount;
            }
            else if (this.CountType == CountByte.FourBytesCount)
            {
                this.RecipientCount = bufferReader.ReadUInt32();
                this.RecipientsData = new RecipientBlock[(uint)this.RecipientCount];
                count = (uint)this.RecipientCount;
            }

            totalBytes += bufferReader.Position;
            byte[] tempArray = bufferReader.ReadToEnd();
            uint bytesCount = 0;
            for (uint i = 0; i < count; i++)
            {
                bufferReader = new BufferReader(tempArray);
                tempArray = bufferReader.ReadBytes(bytesCount, (uint)(tempArray.Length - bytesCount));
                this.RecipientsData[i] = new RecipientBlock(this.CountType);
                bytesCount = this.RecipientsData[i].Deserialize(tempArray);
            }

            totalBytes += bufferReader.Position;
            return totalBytes;
        }
        /// <summary>
        /// Deserialized byte array to a ForwardActionData instance
        /// </summary>
        /// <param name="buffer">Byte array contains data of an ActionData instance.</param>
        /// <returns>Bytes count that deserialized in buffer.</returns>
        public uint Deserialize(byte[] buffer)
        {
            BufferReader bufferReader = new BufferReader(buffer);
            this.Reserved = bufferReader.ReadByte();

            uint count = 0;
            if (this.CountType == CountByte.TwoBytesCount)
            {
                this.NoOfProperties = bufferReader.ReadUInt16();
                this.PropertiesData = new TaggedPropertyValue[(ushort)this.NoOfProperties];
                count = (uint)(ushort)this.NoOfProperties;
            }
            else if (this.CountType == CountByte.FourBytesCount)
            {
                this.NoOfProperties = bufferReader.ReadUInt32();
                this.PropertiesData = new TaggedPropertyValue[(uint)this.NoOfProperties];
                count = (uint)this.NoOfProperties;
            }

            uint size = bufferReader.Position;
            byte[] tmpArray = bufferReader.ReadToEnd();
            for (uint i = 0; i < count; i++)
            {
                TaggedPropertyValue tagValue = AdapterHelper.ReadTaggedProperty(tmpArray);
                this.PropertiesData[i] = tagValue;
                uint tagSize = (uint)tagValue.Size();
                size += tagSize;

                bufferReader = new BufferReader(tmpArray);
                tmpArray = bufferReader.ReadBytes(tagSize, (uint)(tmpArray.Length - tagSize));
            }

            return size;
        }
 /// <summary>
 /// Deserialized byte array to an ActionData instance
 /// </summary>
 /// <param name="buffer">Byte array contain data of an ActionData instance.</param>
 /// <returns>Bytes count that deserialized in buffer.</returns>
 public uint Deserialize(byte[] buffer)
 {
     BufferReader bufferReader = new BufferReader(buffer);
     this.NamedPropertyInformation = new NamedPropertyInfo();
     uint namedPropertyInfoLength = this.NamedPropertyInformation.Deserialize(buffer);
     bufferReader = new BufferReader(bufferReader.ReadBytes(namedPropertyInfoLength, (uint)(buffer.Length - namedPropertyInfoLength)));
     this.RuleVersion = bufferReader.ReadUInt32();
     this.RuleActionBuffer = new RuleAction(CountByte.FourBytesCount);
     uint actionLength = this.RuleActionBuffer.Deserialize(bufferReader.ReadToEnd());
     uint length = namedPropertyInfoLength + sizeof(uint) + actionLength;
     return length;
 }
        /// <summary>
        /// Deserialized byte array to an ActionData instance
        /// </summary>
        /// <param name="buffer">Byte array contain data of an ActionData instance.</param>
        /// <returns>Bytes count that deserialized in buffer.</returns>
        public uint Deserialize(byte[] buffer)
        {
            BufferReader bufferReader = new BufferReader(buffer);
            this.NoOfNamedProps = bufferReader.ReadUInt16();
            if (this.NoOfNamedProps == 0x0000)
            {
                return bufferReader.Position;
            }

            this.PropId = new uint[this.NoOfNamedProps];
            for (int i = 0; i < this.NoOfNamedProps; i++)
            {
                this.PropId[i] = bufferReader.ReadUInt32();
            }

            this.NamedPropertiesSize = bufferReader.ReadUInt32();
            this.NamedProperty = new PropertyName[this.NoOfNamedProps];

            uint length = bufferReader.Position;
            byte[] tmpArray = bufferReader.ReadToEnd();
            int startIndex = 0;
            for (int j = 0; j < this.NoOfNamedProps; j++)
            {
                this.NamedProperty[j] = new PropertyName();
                startIndex += this.NamedProperty[j].Deserialize(tmpArray, startIndex);
            }

            length += (uint)startIndex;
            return length;
        }
        /// <summary>
        /// Deserialized byte array to a Restriction instance
        /// </summary>
        /// <param name="buffer">Byte array contain data of a Restriction instance.</param>
        /// <returns>Bytes count that deserialized in buffer.</returns>
        public override uint Deserialize(byte[] buffer)
        {
            BufferReader reader = new BufferReader(buffer);
            this.RestrictType = (RestrictionType)reader.ReadByte();
            this.RelOp = (RelationalOperator)reader.ReadByte();
            this.propTag.PropertyType = reader.ReadUInt16();
            this.propTag.PropertyId = reader.ReadUInt16();

            uint size = reader.Position;
            byte[] tmpArray = reader.ReadToEnd();
            this.TaggedValue = AdapterHelper.ReadTaggedProperty(tmpArray);
            size += (uint)this.TaggedValue.Size();

            return size;
        }