3 using System.Collections.Generic;
22 byte controlByte =
new byte();
28 public bool FIN {
get => (controlByte & 0x80) == 0x80;
set => controlByte = (byte)(value? controlByte | 0x80 : controlByte & 0x7F);}
33 public Opcodes
Opcode {
get => (Opcodes)(controlByte & 0xF);
34 set => controlByte = (byte)((controlByte & 0xF0) | ((int)value & 0xF)); }
38 public bool Masked {
get => (lengthBytes[0] & 0x80) == 0x80;
set => lengthBytes[0] = (byte)(value ? lengthBytes[0] | 0x80 : lengthBytes[0] & 0x7F); }
46 if ((lengthBytes[0] & 0x7F) <= 125)
48 return (ulong)(lengthBytes[0] & 0x7F);
50 else if ((lengthBytes[0] & 0x7F) == 126)
52 return (ulong)((lengthBytes[2] << 8) + lengthBytes[1]);
54 else if ((lengthBytes[0] & 0x7F) == 127)
56 return (ulong)((lengthBytes[8] << 56) + (lengthBytes[7] << 48) + (lengthBytes[6] << 40) + (lengthBytes[5] << 32) +
57 (lengthBytes[4] << 24) + (lengthBytes[3] << 16) + (lengthBytes[2] << 8) + lengthBytes[1]);
68 if(lengthBytes.Length != 1)
70 byte[] newLengthBytes =
new byte[1];
71 newLengthBytes[0] = lengthBytes[0];
72 lengthBytes = newLengthBytes;
74 lengthBytes[0] = (byte)((lengthBytes[0] & 0x80) | ((byte)value & 0x7F));
76 else if(value <= UInt16.MaxValue)
78 if (lengthBytes.Length != 3)
80 byte[] newLengthBytes =
new byte[3];
81 newLengthBytes[0] = (byte)(lengthBytes[0] & 0x80);
82 newLengthBytes[0] += 126;
83 lengthBytes = newLengthBytes;
85 for(
int i = 1; i < 3; i++)
87 lengthBytes[i] = (byte)(value & 0xFF);
91 else if(value <= UInt64.MaxValue)
93 if (lengthBytes.Length != 8)
95 byte[] newLengthBytes =
new byte[9];
96 newLengthBytes[0] = (byte)(lengthBytes[0] & 0x80);
97 newLengthBytes[0] += 127;
98 lengthBytes = newLengthBytes;
100 for (
int i = 1; i < 9; i++)
102 lengthBytes[i] = (byte)(value & 0xFF);
115 public byte[]
Mask {
get;
set; }
135 controlByte = messageBytes[0];
137 ulong dataLength = 0;
139 if ((messageBytes[1] & 0x7F) <= 125)
141 lengthBytes =
new byte[1];
142 lengthBytes[0] = messageBytes[1];
143 dataLength = (ulong)(messageBytes[1] & 0x7F);
146 else if ((messageBytes[1] & 0x7F) == 126)
148 dataLength = (ulong)((messageBytes[3] << 8) + messageBytes[2]);
149 lengthBytes =
new byte[3];
150 Array.Copy(messageBytes, 1, lengthBytes, 0, 3);
153 else if ((messageBytes[1] & 0x7F) == 127)
155 dataLength = (ulong)((messageBytes[9] << 56) + (messageBytes[8] << 48) + (messageBytes[7] << 40) + (messageBytes[6] << 32) +
156 (messageBytes[5] << 24) + (messageBytes[4] << 16) + (messageBytes[3] << 8) + messageBytes[2]);
158 lengthBytes =
new byte[9];
159 Array.Copy(messageBytes, 1, lengthBytes, 0, 9);
163 lengthBytes =
new byte[0];
166 if ((messageBytes[1] & 0x80) > 0)
168 Array.Copy(messageBytes, dataIndex,
Mask, 0, 4);
171 data =
new byte[dataLength];
172 for(ulong i = 0; i < dataLength; i++)
174 data[i] = (byte)(messageBytes[(ulong)dataIndex + i] ^
Mask[i % 4]);
182 controlByte =
new byte();
185 lengthBytes =
new byte[1];
197 byte[] messageBytes =
new byte[1 + lengthBytes.Length + (
Masked ? 4 : 0) + data.Length];
198 messageBytes[0] = controlByte;
199 Array.Copy(lengthBytes, 0, messageBytes, 1, lengthBytes.Length);
202 Array.Copy(
Mask, 0, messageBytes, 1 + lengthBytes.Length,
Mask.Length);
204 for(
int i = 0; i < data.Length; i++)
206 messageBytes[1 + lengthBytes.Length + (
Masked ? 4 : 0) + i] = (
byte)(
Masked ? data[i] ^
Mask[i % 4] : data[i]);
byte [] Mask
Mask of the message.
Class containing the bytes of a websocket received message.
WebsocketMessage()
Creates a new instance of websocket message.
ulong MessageLength
Length of message.
byte [] Data
Data of the message.
byte [] GetMessageBytes()
Get the packed message bytes.
WebsocketMessage(byte[] messageBytes)
Creates a new instance of websocket message containing the given message.
Opcodes Opcode
Frame Opcode