DataFrameHeader.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using System;
  2. namespace SocketSrv
  3. {
  4. public class DataFrameHeader
  5. {
  6. private bool _fin;
  7. private bool _rsv1;
  8. private bool _rsv2;
  9. private bool _rsv3;
  10. private sbyte _opcode;
  11. private bool _maskcode;
  12. private sbyte _payloadlength;
  13. public bool FIN { get { return _fin; } }
  14. public bool RSV1 { get { return _rsv1; } }
  15. public bool RSV2 { get { return _rsv2; } }
  16. public bool RSV3 { get { return _rsv3; } }
  17. public sbyte OpCode { get { return _opcode; } }
  18. public bool HasMask { get { return _maskcode; } }
  19. public sbyte Length { get { return _payloadlength; } }
  20. public DataFrameHeader(byte[] buffer)
  21. {
  22. if(buffer.Length<2)
  23. throw new Exception("无效的数据头.");
  24. //第一个字节
  25. _fin = (buffer[0] & 0x80) == 0x80;
  26. _rsv1 = (buffer[0] & 0x40) == 0x40;
  27. _rsv2 = (buffer[0] & 0x20) == 0x20;
  28. _rsv3 = (buffer[0] & 0x10) == 0x10;
  29. _opcode = (sbyte)(buffer[0] & 0x0f);
  30. //第二个字节
  31. _maskcode = (buffer[1] & 0x80) == 0x80;
  32. _payloadlength = (sbyte)(buffer[1] & 0x7f);
  33. }
  34. //发送封装数据
  35. public DataFrameHeader(bool fin,bool rsv1,bool rsv2,bool rsv3,sbyte opcode,bool hasmask,int length)
  36. {
  37. _fin = fin;
  38. _rsv1 = rsv1;
  39. _rsv2 = rsv2;
  40. _rsv3 = rsv3;
  41. _opcode = opcode;
  42. //第二个字节
  43. _maskcode = hasmask;
  44. _payloadlength = (sbyte)length;
  45. }
  46. //返回帧头字节
  47. public byte[] GetBytes()
  48. {
  49. byte[] buffer = new byte[2]{0,0};
  50. if (_fin) buffer[0] ^= 0x80;
  51. if (_rsv1) buffer[0] ^= 0x40;
  52. if (_rsv2) buffer[0] ^= 0x20;
  53. if (_rsv3) buffer[0] ^= 0x10;
  54. buffer[0] ^= (byte)_opcode;
  55. if (_maskcode) buffer[1] ^= 0x80;
  56. buffer[1] ^= (byte)_payloadlength;
  57. return buffer;
  58. }
  59. }
  60. }