internal static byte[] RawToProtocolPacket(WebSocketPacket aDataPacket) { byte[] lBuff = new byte[2]; WebSocketFrameType lFrameType = aDataPacket.GetFrameType(); int lTargetType = (int)lFrameType; if (lTargetType.Equals(-1)) throw new WebSocketRuntimeException("Cannot construct a packet with unknown packet type: " + lFrameType); if (aDataPacket.IsEndFrame()) lBuff[0] = (byte)(lTargetType | 0x80); else lBuff[0] = (byte)(lTargetType); int lPayloadLen = aDataPacket.GetByteArray().Length; if (lPayloadLen < 126) lBuff[1] = (byte)(lPayloadLen | 0x80); else if (lPayloadLen >= 126 && lPayloadLen < 0xFFFF) { lBuff[1] = (byte)(126 | 0x80); int lSize = lBuff.Length; lBuff = CopyOf(lBuff, lSize + 2); lBuff[lSize] = (byte)((lPayloadLen >> 8) & 0xFF); lBuff[lSize + 1] = (byte)(lPayloadLen & 0xFF); } else if (lPayloadLen >= 0xFFFF) { lBuff[1] = (byte)(127 | 0x80); long lLen = (long)lPayloadLen; int lSize = lBuff.Length; lBuff = CopyOf(lBuff, lSize + 8); lBuff[lSize] = (byte)(lLen >> 56); lBuff[lSize + 1] = (byte)(lLen >> 48); lBuff[lSize + 2] = (byte)(lLen >> 40); lBuff[lSize + 3] = (byte)(lLen >> 32); lBuff[lSize + 4] = (byte)(lLen >> 24); lBuff[lSize + 5] = (byte)(lLen >> 16); lBuff[lSize + 6] = (byte)(lLen >> 8); lBuff[lSize + 7] = (byte)lLen; } int lSizes = lBuff.Length; lBuff = CopyOf(lBuff, lSizes + 4); lBuff[lSizes] = (byte)mRan.Next(0, 255); lBuff[lSizes + 1] = (byte)mRan.Next(0, 255); lBuff[lSizes + 2] = (byte)mRan.Next(0, 255); lBuff[lSizes + 3] = (byte)mRan.Next(0, 255); byte[] lMask = new byte[4]; Array.Copy(lBuff, lBuff.Length - 4, lMask, 0, 4); byte[] lBuffData = new byte[aDataPacket.GetByteArray().Length]; Array.Copy(aDataPacket.GetByteArray(), 0, lBuffData, 0, lBuffData.Length); byte[] lMaskedData = new byte[lBuffData.Length]; int lPos = 0; for (int i = 0; i < lBuffData.Length; i++) { lMaskedData[i] = (byte)Convert.ToInt32(lBuffData[i] ^ lMask[lPos]); if (lPos == 3) lPos = 0; else lPos++; } lBuff = CopyOf(lBuff, lBuff.Length + lMaskedData.Length); Array.Copy(lMaskedData, 0, lBuff, lBuff.Length - lMaskedData.Length, lMaskedData.Length); return lBuff; }
public static byte[] RawToProtocolPacket(WebSocketPacket aDataPacket) { byte[] lBuff = new byte[2]; WebSocketFrameType lFrameType = aDataPacket.GetFrameType(); int lTargetType = (int)lFrameType; if (lTargetType.Equals(-1)) { throw new WebSocketRuntimeException("Cannot construct a packet with unknown packet type: " + lFrameType); } if (aDataPacket.IsEndFrame()) { lBuff[0] = (byte)(lTargetType | 0x80); } else { lBuff[0] = (byte)(lTargetType); } int lPayloadLen = aDataPacket.GetByteArray().Length; if (lPayloadLen < 126) { lBuff[1] = (byte)(lPayloadLen | 0x80); } else if (lPayloadLen >= 126 && lPayloadLen < 0xFFFF) { lBuff[1] = (byte)(126 | 0x80); int lSize = lBuff.Length; lBuff = CopyOf(lBuff, lSize + 2); lBuff[lSize] = (byte)((lPayloadLen >> 8) & 0xFF); lBuff[lSize + 1] = (byte)(lPayloadLen & 0xFF); } else if (lPayloadLen >= 0xFFFF) { lBuff[1] = (byte)(127 | 0x80); long lLen = (long)lPayloadLen; int lSize = lBuff.Length; lBuff = CopyOf(lBuff, lSize + 8); lBuff[lSize] = (byte)(lLen >> 56); lBuff[lSize + 1] = (byte)(lLen >> 48); lBuff[lSize + 2] = (byte)(lLen >> 40); lBuff[lSize + 3] = (byte)(lLen >> 32); lBuff[lSize + 4] = (byte)(lLen >> 24); lBuff[lSize + 5] = (byte)(lLen >> 16); lBuff[lSize + 6] = (byte)(lLen >> 8); lBuff[lSize + 7] = (byte)lLen; } int lSizes = lBuff.Length; lBuff = CopyOf(lBuff, lSizes + 4); lBuff[lSizes] = (byte)mRan.Next(0, 255); lBuff[lSizes + 1] = (byte)mRan.Next(0, 255); lBuff[lSizes + 2] = (byte)mRan.Next(0, 255); lBuff[lSizes + 3] = (byte)mRan.Next(0, 255); byte[] lMask = new byte[4]; Array.Copy(lBuff, lBuff.Length - 4, lMask, 0, 4); byte[] lBuffData = new byte[aDataPacket.GetByteArray().Length]; Array.Copy(aDataPacket.GetByteArray(), 0, lBuffData, 0, lBuffData.Length); byte[] lMaskedData = new byte[lBuffData.Length]; int lPos = 0; for (int i = 0; i < lBuffData.Length; i++) { lMaskedData[i] = (byte)Convert.ToInt32(lBuffData[i] ^ lMask[lPos]); if (lPos == 3) { lPos = 0; } else { lPos++; } } lBuff = CopyOf(lBuff, lBuff.Length + lMaskedData.Length); Array.Copy(lMaskedData, 0, lBuff, lBuff.Length - lMaskedData.Length, lMaskedData.Length); return(lBuff); }