Exemplo n.º 1
0
        internal DataFrame(byte[] buffer)
        {
            //帧头
            header = new DataFrameHeader(buffer);

            //扩展长度
            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);
            }

            //是否有掩码
            if (header.HasMask)
            {
                mask = new byte[4];
                Buffer.BlockCopy(buffer, extend.Length + 2, mask, 0, 4);
            }

            //消息体
            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 = (int)extend[0] * 256 + (int)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 += (int)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);
            }
        }
Exemplo n.º 2
0
        internal DataFrame(string content)
        {
            this.content = Encoding.UTF8.GetBytes(content);
            int length = this.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;
                    }
                }
            }
        }