DataFrame.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. using System;
  2. using System.Text;
  3. namespace SocketSrv
  4. {
  5. public class DataFrame
  6. {
  7. DataFrameHeader _header;
  8. private byte[] _extend = new byte[0];
  9. private byte[] _mask = new byte[0];
  10. private byte[] _content = new byte[0];
  11. public DataFrame(byte[] buffer)
  12. {
  13. //帧头
  14. _header = new DataFrameHeader(buffer);
  15. //扩展长度
  16. if (_header.Length == 126)
  17. {
  18. _extend = new byte[2];
  19. Buffer.BlockCopy(buffer, 2, _extend, 0, 2);
  20. }
  21. else if (_header.Length == 127)
  22. {
  23. _extend = new byte[8];
  24. Buffer.BlockCopy(buffer, 2, _extend, 0, 8);
  25. }
  26. //是否有掩码
  27. if (_header.HasMask)
  28. {
  29. _mask = new byte[4];
  30. Buffer.BlockCopy(buffer, _extend.Length + 2, _mask, 0, 4);
  31. }
  32. //消息体
  33. if (_extend.Length == 0)
  34. {
  35. _content = new byte[_header.Length];
  36. Buffer.BlockCopy(buffer, _extend.Length + _mask.Length + 2 , _content, 0, _content.Length);
  37. }
  38. else if (_extend.Length == 2)
  39. {
  40. int contentLength = (int)_extend[0] * 256 + (int)_extend[1];
  41. _content = new byte[contentLength];
  42. Buffer.BlockCopy(buffer, _extend.Length + _mask.Length + 2, _content, 0, contentLength > 1024 * 100 ? 1024 * 100 : contentLength);
  43. }
  44. else
  45. {
  46. long len = 0;
  47. int n = 1;
  48. for (int i = 7; i >= 0; i--)
  49. {
  50. len += (int)_extend[i] * n;
  51. n *= 256;
  52. }
  53. _content = new byte[len];
  54. Buffer.BlockCopy(buffer, _extend.Length + _mask.Length + 2, _content, 0, _content.Length);
  55. }
  56. if (_header.HasMask) _content = Mask(_content, _mask);
  57. }
  58. public DataFrame(string content)
  59. {
  60. _content = Encoding.UTF8.GetBytes(content);
  61. int length = _content.Length;
  62. if (length < 126)
  63. {
  64. _extend = new byte[0];
  65. _header = new DataFrameHeader(true, false, false, false, 1, false, length);
  66. }
  67. else if (length < 65536)
  68. {
  69. _extend = new byte[2];
  70. _header = new DataFrameHeader(true, false, false, false, 1, false, 126);
  71. _extend[0] = (byte)(length / 256);
  72. _extend[1] = (byte)(length % 256);
  73. }
  74. else
  75. {
  76. _extend = new byte[8];
  77. _header = new DataFrameHeader(true, false, false, false, 1, false, 127);
  78. int left = length;
  79. int unit = 256;
  80. for (int i = 7; i > 1; i--)
  81. {
  82. _extend[i] = (byte)(left % unit);
  83. left = left / unit;
  84. if (left == 0)
  85. break;
  86. }
  87. }
  88. }
  89. public byte[] GetBytes()
  90. {
  91. byte[] buffer = new byte[2 + _extend.Length + _mask.Length + _content.Length];
  92. Buffer.BlockCopy(_header.GetBytes(), 0, buffer, 0, 2);
  93. Buffer.BlockCopy(_extend, 0, buffer, 2, _extend.Length);
  94. Buffer.BlockCopy(_mask, 0, buffer, 2 + _extend.Length, _mask.Length);
  95. Buffer.BlockCopy(_content, 0, buffer, 2 + _extend.Length + _mask.Length, _content.Length);
  96. return buffer;
  97. }
  98. public string Text
  99. {
  100. get
  101. {
  102. if (_header.OpCode != 1)
  103. return string.Empty;
  104. return Encoding.UTF8.GetString(_content);
  105. }
  106. }
  107. private byte[] Mask(byte[] data, byte[] mask)
  108. {
  109. for (var i = 0; i < data.Length; i++)
  110. {
  111. data[i] = (byte)(data[i] ^ mask[i % 4]);
  112. }
  113. return data;
  114. }
  115. }
  116. }