Exemple #1
0
        /// <summary>
        /// Parses a metadata.
        /// Metadata consists of a list of properties consisting of
        /// name and value as size-specified strings.
        /// </summary>
        /// <returns>Returns true on success and false on error.</returns>
        protected bool ParseMetadata(Span <byte> source)
        {
            while (source.Length > 1)
            {
                int nameLength = source[0];
                source = source.Slice(NameLengthSize);
                if (source.Length < nameLength)
                {
                    break;
                }

                string name = SpanUtility.ToAscii(source.Slice(0, nameLength));
                source = source.Slice(nameLength);
                if (source.Length < ValueLengthSize)
                {
                    break;
                }

                int valueLength = NetworkOrderBitsConverter.ToInt32(source);
                source = source.Slice(ValueLengthSize);
                if (source.Length < valueLength)
                {
                    break;
                }

                byte[] value = new byte[valueLength];
                source.Slice(0, valueLength).CopyTo(value);
                source = source.Slice(valueLength);

                if (name == ZmtpPropertyIdentity && Options.RecvIdentity)
                {
                    PeerIdentity = value;
                }
                else if (name == ZmtpPropertySocketType)
                {
                    if (!CheckSocketType(Encoding.ASCII.GetString(value)))
                    {
                        return(false);
                    }
                }
                else
                {
                    if (!GetProperty(name, value, valueLength))
                    {
                        return(false);
                    }
                }
            }

            if (source.Length > 0)
            {
                return(false);
            }

            return(true);
        }
        private static void RoundTripInt32(int num, params byte[] bytes)
        {
            byte[] buffer = NetworkOrderBitsConverter.GetBytes(num);

            Assert.Equal(4, buffer.Length);
            Assert.Equal(bytes, buffer);

            Assert.Equal(num, NetworkOrderBitsConverter.ToInt32(buffer));

            NetworkOrderBitsConverter.PutInt32(num, buffer);

            Assert.Equal(bytes, buffer);

            Assert.Equal(num, NetworkOrderBitsConverter.ToInt32(buffer));
        }
        public void TestInt64()
        {
            byte[] buffer = NetworkOrderBitsConverter.GetBytes(1);

            Assert.AreEqual(1, buffer[3]);
            Assert.AreEqual(0, buffer[0]);

            long num = NetworkOrderBitsConverter.ToInt32(buffer);

            Assert.AreEqual(1, num);

            NetworkOrderBitsConverter.PutInt32(16777216, buffer, 0);

            Assert.AreEqual(1, buffer[0]);
            Assert.AreEqual(0, buffer[3]);

            num = NetworkOrderBitsConverter.ToInt32(buffer);

            Assert.AreEqual(16777216, num);
        }
Exemple #4
0
        /// <summary>
        /// Parses a metadata.
        /// Metadata consists of a list of properties consisting of
        /// name and value as size-specified strings.
        /// </summary>
        /// <returns>Returns true on success and false on error.</returns>
        protected bool ParseMetadata(byte[] source, int offset, int length)
        {
            int bytesLeft = length;

            while (bytesLeft > 1)
            {
                int nameLength = source[offset];
                offset    += NameLengthSize;
                bytesLeft -= NameLengthSize;
                if (bytesLeft < nameLength)
                {
                    break;
                }

                string name = Encoding.ASCII.GetString(source, offset, nameLength);
                offset    += nameLength;
                bytesLeft -= nameLength;
                if (bytesLeft < ValueLengthSize)
                {
                    break;
                }

                int valueLength = NetworkOrderBitsConverter.ToInt32(source, offset);
                offset    += ValueLengthSize;
                bytesLeft -= ValueLengthSize;
                if (bytesLeft < valueLength)
                {
                    break;
                }

                byte[] value = new byte[valueLength];
                Buffer.BlockCopy(source, offset, value, 0, valueLength);
                offset    += valueLength;
                bytesLeft -= valueLength;

                if (name == ZmtpPropertyIdentity && Options.RecvIdentity)
                {
                    PeerIdentity = value;
                }
                else if (name == ZmtpPropertySocketType)
                {
                    if (!CheckSocketType(Encoding.ASCII.GetString(value)))
                    {
                        return(false);
                    }
                }
                else
                {
                    if (!GetProperty(name, value, valueLength))
                    {
                        return(false);
                    }
                }
            }

            if (bytesLeft > 0)
            {
                return(false);
            }

            return(true);
        }