DataFrame.cs 4.1 KB

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