예제 #1
0
        public void TestHeaderToLength()
        {
            var  header         = new byte[] { 1, 32, 3 };
            long expectedLength = 256 * 256 * 1 + 32 * 256 + 3;
            var  length         = DataProcessorUtil.HeaderToLength(header);

            Assert.AreEqual(expectedLength, length);
        }
예제 #2
0
        public void TestHeaderSizeFromLengthZero()
        {
            long size = 0;

            byte[] headerExpected = new byte[] { 0 };

            var heeader = DataProcessorUtil.LengthToHeader(size, 1);

            Assert.IsTrue(headerExpected.SequenceEqual(heeader));
        }
예제 #3
0
        public void TestHeaderSizeFromLengthPad()
        {
            long size = 224 + (2 * 256) + (3 * 256 * 256) + (4 * 256 * 256 * 256);

            byte[] headerExpected = new byte[] { 0, 0, 4, 3, 2, 224 };

            var heeader = DataProcessorUtil.LengthToHeader(size, 6);

            Assert.IsTrue(headerExpected.SequenceEqual(heeader));
        }
예제 #4
0
        /// <summary>
        /// Filter send data
        /// </summary>
        /// <param name="msg"></param>
        /// <returns></returns>
        public byte[] FilterSendData(byte[] msg)
        {
            // length check
            if (msg.Length > MaxSize)
            {
                _logger.LogError("Message is too long.");
                return(null);
            }

            // set length header
            var header = DataProcessorUtil.LengthToHeader(msg.Length, _headerSize);
            var ret    = new byte[msg.Length + 1 + _headerSize];

            ret[0] = 0;
            Buffer.BlockCopy(header, 0, ret, 1, _headerSize);
            Buffer.BlockCopy(msg, 0, ret, 1 + _headerSize, msg.Length);
            return(ret);
        }
예제 #5
0
        /// <summary>
        /// Process buffer
        /// </summary>
        /// <param name="recieved"></param>
        /// <param name="length"></param>
        /// <returns></returns>
        public IEnumerable <byte[]> ProcessReceivedRawData(byte[] recieved, int length)
        {
            // check package length
            if (length > _buffer.Length)
            {
                _logger.LogError("Recieved is too long.");
                return(null);
            }

            // check buffer lenght
            else if (_bufferLength + length > _buffer.Length)
            {
                _logger.LogError("Buffer overdraw. Deleting buffer.");
                _bufferLength = 0;
                return(null);
            }

            // copy message to buffer
            Buffer.BlockCopy(recieved, 0, _buffer, _bufferLength, length);
            _bufferLength = _bufferLength + length;

            // find starts of messages
            var starts = _buffer.FindOccurrences(_delimiter, _bufferLength, ContainerSize);

            if (!starts.Any())
            {
                return(new List <byte[]>());
            }

            // get intervals
            var intervals = starts.Where(pos => _bufferLength >= pos + ContainerSize &&
                                         _bufferLength >= pos + ContainerSize + DataProcessorUtil.HeaderToLength(_buffer.Slice(pos + 1, _headerSize))).
                            Select(pos => new Tuple <int, int>(pos + ContainerSize,
                                                               (int)DataProcessorUtil.HeaderToLength(_buffer.Slice(pos + 1, _headerSize)))).
                            ToArray();

            // no intervals found
            if (!intervals.Any())
            {
                return(new List <byte[]>());
            }

            // fix intervals to not overlap
            intervals = Enumerable.Range(0, intervals.Length).Select(i => {
                var cur = intervals[i];
                if (i + 1 >= intervals.Length)
                {
                    return(cur);
                }
                var next   = intervals[i + 1];
                var endPos = cur.Item1 + cur.Item2 - 1;
                if (endPos >= next.Item1)
                {
                    _logger.LogError("Overlapping messages");
                    return(new Tuple <int, int>(cur.Item1, next.Item1 - cur.Item1));
                }
                return(cur);
            }).ToArray();

            // get messages
            var msgs = _buffer.SliceMulti(intervals);

            // move buffer
            var start = intervals.Last().Item1 + intervals.Last().Item2 + 1;

            if (start >= _bufferLength)
            {
                _bufferLength = 0;
            }
            else
            {
                var len = _bufferLength - start;
                _bufferLength = _buffer.ReplaceWith(_buffer, start, 0, len);
            }

            // return
            return(msgs);
        }
예제 #6
0
        public void TestHeaderSizeZeroRequiresOneByteForLength()
        {
            long length = 0;

            Assert.ThrowsException <ArgumentException>(() => DataProcessorUtil.LengthToHeader(length, 0));
        }
예제 #7
0
        public void TestHeaderSizeTooSmall()
        {
            long length = 256 * 256;

            Assert.ThrowsException <ArgumentException>(() => DataProcessorUtil.LengthToHeader(length, 1));
        }
예제 #8
0
        public void TestHeadertoLengthTooBigHeader()
        {
            var header = Enumerable.Range(0, 2000).Select(i => (byte)1).ToArray();

            Assert.ThrowsException <ArgumentException>(() => DataProcessorUtil.HeaderToLength(header));
        }