예제 #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
        /// <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);
        }
예제 #3
0
        public void TestHeadertoLengthTooBigHeader()
        {
            var header = Enumerable.Range(0, 2000).Select(i => (byte)1).ToArray();

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