public DataFrame(string content)
        {
            _content = Encoding.UTF8.GetBytes(content);
            int length = _content.Length;

            if (length < 126)
            {
                _extend = new byte[0];
                _header = new DataFrameHeader(true, false, false, false, 1, false, length);
            }
            else if (length < 65536)
            {
                _extend    = new byte[2];
                _header    = new DataFrameHeader(true, false, false, false, 1, false, 126);
                _extend[0] = (byte)(length / 256);
                _extend[1] = (byte)(length % 256);
            }
            else
            {
                _extend = new byte[8];
                _header = new DataFrameHeader(true, false, false, false, 1, false, 127);
                int left = length;
                int unit = 256;
                for (int i = 7; i > 1; i--)
                {
                    _extend[i] = (byte)(left % unit);
                    left       = left / unit;
                    if (left == 0)
                    {
                        break;
                    }
                }
            }
        }
 public DataFrame(byte[] buffer)
 {
     // Frame header
     _header = new DataFrameHeader(buffer);
     // Extension length
     if (_header.Length == 126)
     {
         _extend = new byte[2];
         Buffer.BlockCopy(buffer, 2, _extend, 0, 2);
     }
     else if (_header.Length == 127)
     {
         _extend = new byte[8];
         Buffer.BlockCopy(buffer, 2, _extend, 0, 8);
     }
     // Is there a mask?
     if (_header.HasMask)
     {
         _mask = new byte[4];
         Buffer.BlockCopy(buffer, _extend.Length + 2, _mask, 0, 4);
     }
     // Message body
     if (_extend.Length == 0)
     {
         _content = new byte[_header.Length];
         Buffer.BlockCopy(buffer, _extend.Length + _mask.Length + 2, _content, 0, _content.Length);
     }
     else if (_extend.Length == 2)
     {
         int contentLength = _extend[0] * 256 + _extend[1];
         _content = new byte[contentLength];
         Buffer.BlockCopy(buffer, _extend.Length + _mask.Length + 2, _content, 0, contentLength > 1024 * 100 ? 1024 * 100 : contentLength);
     }
     else
     {
         long len = 0;
         int  n   = 1;
         for (int i = 7; i >= 0; i--)
         {
             len += _extend[i] * n;
             n   *= 256;
         }
         _content = new byte[len];
         Buffer.BlockCopy(buffer, _extend.Length + _mask.Length + 2, _content, 0, _content.Length);
     }
     if (_header.HasMask)
     {
         _content = Mask(_content, _mask);
     }
 }