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); }
/// <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); }
public void TestHeadertoLengthTooBigHeader() { var header = Enumerable.Range(0, 2000).Select(i => (byte)1).ToArray(); Assert.ThrowsException <ArgumentException>(() => DataProcessorUtil.HeaderToLength(header)); }