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); } }
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; } } } }