private string DecodeClientData(byte[] bytes)
{
byte secondByte = bytes[1];
//length = secondByte AND 127 // may not be the actual length in the two special cases
int length = secondByte & 127;
//indexFirstMask = 2 // if not a special case
int indexFirstMask = 2;
//if length == 126 // if a special case, change indexFirstMask
// indexFirstMask = 4
if (length == 126)
{
indexFirstMask = 4;
}
//else if length == 127 // ditto
// indexFirstMask = 10
else if (length == 127)
{
indexFirstMask = 10;
}
//masks = bytes.slice(indexFirstMask, 4) // four bytes starting from indexFirstMask
byte[] masks = bytes.Skip(indexFirstMask).Take(4).ToArray();
//indexFirstDataByte = indexFirstMask + 4 // four bytes further
int indexFirstDataByte = indexFirstMask + 4;
//decoded = new array
var decoded = new byte[bytes.Length - indexFirstDataByte];
//decoded.length = bytes.length - indexFirstDataByte // length of real data
//for i = indexFirstDataByte, j = 0; i < bytes.length; i++, j++
// decoded[j] = bytes[i] XOR masks[j MOD 4]
for (int i = indexFirstDataByte, j = 0; i < bytes.Length; i++, j++)
{
decoded[j] = (byte) (bytes[i] ^ masks[j%4]);
}
return Encoding.GetString(decoded);
}