public byte[] Encode()
{
int len = payload.Length;
int capacity = 2 + len;
if (len <= 125)
capacity += 0;
else if (len <= 65535)
capacity += 2;
else
capacity += 8;
if (mask)
capacity += 4;
MemoryStream stream = new MemoryStream(new byte[capacity], 0, capacity, true, true);
// fin(1) | reserved(3) | opcode(4)
int b1 = (int)opcode;
if (fin)
b1 |= 0x80;
stream.WriteByte((byte)b1);
// mask(1) | payload len(7) | extended payload len (16 or 64)
if (len <= 125)
{
stream.WriteByte((byte)maskBit(len));
}
else if (len <= 65535)
{
stream.WriteByte((byte)maskBit(126));
stream.WriteByte((byte)(len >> 8));
stream.WriteByte((byte)len);
}
else
{
stream.WriteByte((byte)maskBit(127));
for (int i = 7; i >= 0; i--)
stream.WriteByte((byte)(len >> (i * 8)));
}
if (mask)
{
stream.Write(maskingKey, 0, maskingKey.Length);
// encode payload
byte[] masked = new byte[payload.Length];
for (int i = 0; i < payload.Length; i++)
masked[i] = (byte)(payload[i] ^ maskingKey[i % 4]);
stream.Write(masked, 0, masked.Length);
}
else
{
stream.Write(payload, 0, payload.Length);
}
return stream.GetBuffer();
}