Beispiel #1
0
        /// <summary>
        /// See interface docs.
        /// </summary>
        /// <param name="bytes"></param>
        /// <param name="offset"></param>
        /// <param name="bytesRead"></param>
        /// <returns></returns>
        public IEnumerable <ExtractedBytes> ExtractMessageBytes(byte[] bytes, int offset, int bytesRead)
        {
            var length = _ReadBufferLength + bytesRead;

            if (_ReadBuffer == null || length > _ReadBuffer.Length)
            {
                var newReadBuffer = new byte[length];
                if (_ReadBuffer != null)
                {
                    _ReadBuffer.CopyTo(newReadBuffer, 0);
                }
                _ReadBuffer = newReadBuffer;
            }
            Array.ConstrainedCopy(bytes, offset, _ReadBuffer, _ReadBufferLength, bytesRead);
            _ReadBufferLength = length;

            var bufferEntirelyUsed = true;

            for (var i = 0; i < _ReadBufferLength;)
            {
                var lengthRemaining = _ReadBufferLength - i;
                var packetLength    = (int)_ReadBuffer[i];
                if (packetLength > lengthRemaining)
                {
                    bufferEntirelyUsed = false;
                    for (int si = i, di = 0; si < _ReadBufferLength; ++si, ++di)
                    {
                        _ReadBuffer[di] = _ReadBuffer[si];
                    }
                    _ReadBufferLength -= i;
                    break;
                }
                else
                {
                    var packet = new byte[packetLength];
                    Array.ConstrainedCopy(_ReadBuffer, i, packet, 0, packetLength);
                    _ExtractedBytes.ChecksumFailed = !_Compressor.IsCompressedMessage(packet);
                    _ExtractedBytes.Bytes          = _ExtractedBytes.ChecksumFailed ? null : packet;
                    _ExtractedBytes.Length         = _ExtractedBytes.ChecksumFailed ? 0 : packetLength;

                    yield return(_ExtractedBytes);

                    i += _ExtractedBytes.ChecksumFailed ? 1 : packetLength;
                }
            }

            if (bufferEntirelyUsed)
            {
                _ReadBufferLength = 0;
            }
        }
 public void BaseStationMessageCompressor_IsCompressedMessage_Returns_True_If_Bytes_Represent_Compressed_Message()
 {
     Assert.IsTrue(_Compressor.IsCompressedMessage(_Compressor.Compress(_Message)));
 }