Advertisement
Guest User

Untitled

a guest
Jul 18th, 2018
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.63 KB | None | 0 0
  1. using System;
  2. using System.Text;
  3.  
  4. namespace Test {
  5. public class ByteBuffer {
  6. public int readerIndex { get; set; }
  7. public int writerIndex { get; set; }
  8. private byte[] buffer;
  9. private int capacity;
  10.  
  11. public ByteBuffer() {
  12. readerIndex = 0;
  13. writerIndex = 0;
  14. capacity = 32;
  15. buffer = new byte[capacity];
  16. }
  17.  
  18. private void resizeIfNeeded(int bytesCount) {
  19. if (writerIndex + bytesCount < capacity) {
  20. return;
  21. }
  22.  
  23. capacity = (int)(capacity * 1.7f) + bytesCount;
  24. var newBuffer = new byte[capacity];
  25. Array.Copy(buffer, newBuffer, buffer.Length);
  26. buffer = newBuffer;
  27. }
  28.  
  29. public void writeByte(int value) {
  30. resizeIfNeeded(1);
  31.  
  32. buffer[writerIndex++] = (byte) (value & 0x000000FF);
  33. }
  34.  
  35. public void writeWord(int value) {
  36. resizeIfNeeded(2);
  37.  
  38. buffer[writerIndex++] = (byte) (value & 0x000000FF);
  39. buffer[writerIndex++] = (byte) ((value >> 8) & 0x000000FF);
  40. }
  41.  
  42. public void writeDword(int value) {
  43. resizeIfNeeded(4);
  44.  
  45. buffer[writerIndex++] = (byte) (value & 0x000000FF);
  46. buffer[writerIndex++] = (byte) ((value >> 8) & 0x000000FF);
  47. buffer[writerIndex++] = (byte) ((value >> 16) & 0x000000FF);
  48. buffer[writerIndex++] = (byte) ((value >> 24) & 0x000000FF);
  49. }
  50.  
  51. public void writeQword(ulong value) {
  52. resizeIfNeeded(8);
  53.  
  54. buffer[writerIndex++] = (byte) (value & 0x00000000000000FF);
  55. buffer[writerIndex++] = (byte) ((value >> 8) & 0x00000000000000FF);
  56. buffer[writerIndex++] = (byte) ((value >> 16) & 0x00000000000000FF);
  57. buffer[writerIndex++] = (byte) ((value >> 24) & 0x00000000000000FF);
  58. buffer[writerIndex++] = (byte) ((value >> 32) & 0x00000000000000FF);
  59. buffer[writerIndex++] = (byte) ((value >> 40) & 0x00000000000000FF);
  60. buffer[writerIndex++] = (byte) ((value >> 48) & 0x00000000000000FF);
  61. buffer[writerIndex++] = (byte) ((value >> 56) & 0x00000000000000FF);
  62. }
  63.  
  64. public void writeByteArray(byte[] bytes) {
  65. var length = bytes.Length;
  66.  
  67. //string length + string will be written to the buffer
  68. resizeIfNeeded(length + 4);
  69.  
  70. writeDword(length);
  71. Array.Copy(bytes, 0, buffer, writerIndex, length);
  72.  
  73. writerIndex += length;
  74. }
  75.  
  76. public void writeString(string value) {
  77. var length = value.Length;
  78.  
  79. //string length + string will be written to the buffer
  80. resizeIfNeeded(length + 4);
  81.  
  82. writeByteArray(Encoding.UTF8.GetBytes(value));
  83. }
  84.  
  85. public int readByte() {
  86. return buffer[readerIndex++];
  87. }
  88.  
  89. public int readWord() {
  90. int value = 0;
  91.  
  92. value |= buffer[readerIndex++];
  93. value |= buffer[readerIndex++] << 8;
  94.  
  95. return value;
  96. }
  97.  
  98. public int readDword() {
  99. int value = 0;
  100.  
  101. value |= buffer[readerIndex++];
  102. value |= buffer[readerIndex++] << 8;
  103. value |= buffer[readerIndex++] << 16;
  104. value |= buffer[readerIndex++] << 24;
  105.  
  106. return value;
  107. }
  108.  
  109. public ulong readQword() {
  110. ulong value = 0;
  111.  
  112. value |= (ulong)buffer[readerIndex++];
  113. value |= (ulong)buffer[readerIndex++] << 8;
  114. value |= (ulong)buffer[readerIndex++] << 16;
  115. value |= (ulong)buffer[readerIndex++] << 24;
  116. value |= (ulong)buffer[readerIndex++] << 32;
  117. value |= (ulong)buffer[readerIndex++] << 40;
  118. value |= (ulong)buffer[readerIndex++] << 48;
  119. value |= (ulong)buffer[readerIndex++] << 56;
  120.  
  121. return value;
  122. }
  123.  
  124. public byte[] readByteArray() {
  125. var bytesCount = readDword();
  126. var bytes = new byte[bytesCount];
  127.  
  128. Array.Copy(buffer, readerIndex, bytes, 0, bytesCount);
  129. readerIndex += bytesCount;
  130.  
  131. return bytes;
  132. }
  133.  
  134. public string readString() {
  135. return Encoding.UTF8.GetString(readByteArray());
  136. }
  137. }
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement