public void ReconstructMessagePage(BMSByte page, EndPoint sender)
        {
            Sender = sender;
            if (MessageReconstructed)
            {
                return;
            }

            if (page.Size == 0)
            {
                throw new ArgumentException($"The input page buffer had an invalid size of 0");
            }

            var pageNumber = page.GetBasicType <int>();
            var totalSize  = page.GetBasicType <int>();

            if (page.Size == 0)
            {
                throw new ArgumentException($"The input page buffer had an invalid size of 0");
            }

            if (page.Size + page.StartPointer == totalSize)
            {
                MessageBuffer.Append(page);
                MessageReconstructed = true;
            }
            else
            {
                if (_pages == null)
                {
                    double actualSize = page.StartPointer + page.Size;
                    MessageBuffer.SetArraySize(totalSize);
                    int count = (int)System.Math.Ceiling(totalSize / actualSize);
                    _pages = new BMSByte[count];
                }
                if (_pages[pageNumber] == null)
                {
                    _pages[pageNumber] = _bufferPool.Get(page.Size);
                    _pages[pageNumber].Clone(page);
                }
                if (IsDone())
                {
                    foreach (var p in _pages)
                    {
                        MessageBuffer.Append(p);
                        _bufferPool.Release(p);
                    }
                    MessageReconstructed = true;
                }
            }
        }