ByteReader.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace EPD.Data
  7. {
  8. class ByteReader
  9. {
  10. private byte[] buffer;
  11. private int idx;
  12. private int length;
  13. public int Length => length;
  14. public ByteReader(byte[] data, int len)
  15. {
  16. buffer = new byte[len];
  17. Buffer.BlockCopy(data, 0, buffer, 0, len);
  18. length = len;
  19. idx = 0;
  20. }
  21. public void Append(byte[] data, int len)
  22. {
  23. var buf = new byte[Length + len];
  24. Buffer.BlockCopy(buffer, 0, buf, 0, Length);
  25. Buffer.BlockCopy(data, 0, buf, Length, len);
  26. buffer = buf;
  27. length += len;
  28. }
  29. public bool Reset(int curIdx = 0)
  30. {
  31. if (curIdx < length)
  32. idx = curIdx;
  33. return idx == curIdx;
  34. }
  35. public bool ReadByte(out byte data)
  36. {
  37. data = buffer[idx];
  38. idx++;
  39. return true;
  40. }
  41. public bool ReadBytes(byte[] buf, int len)
  42. {
  43. if (idx + len <= length)
  44. {
  45. Buffer.BlockCopy(buffer, (int)idx, buf, 0, (int)len);
  46. idx += len;
  47. return true;
  48. }
  49. return false;
  50. }
  51. public bool ReadInt(out int data)
  52. {
  53. data = 0;
  54. if (idx + 4 <= length)
  55. {
  56. data = BitConverter.ToInt32(buffer, (int)idx);
  57. idx += 4;
  58. return true;
  59. }
  60. return false;
  61. }
  62. public bool ReadUInt16(out UInt16 data)
  63. {
  64. data = 0;
  65. if (idx + 2 <= length)
  66. {
  67. data = BitConverter.ToUInt16(buffer, (int)idx);
  68. idx += 2;
  69. return true;
  70. }
  71. return false;
  72. }
  73. public bool ReadInt64(out Int64 data)
  74. {
  75. data = 0;
  76. if (idx + 8 <= length)
  77. {
  78. data = BitConverter.ToInt64(buffer, (int)idx);
  79. idx += 8;
  80. return true;
  81. }
  82. return false;
  83. }
  84. public bool ReadString(out string str, int len)
  85. {
  86. str = System.Text.Encoding.Default.GetString(buffer, idx, len);
  87. str = str.Substring(0, str.IndexOf('\0'));
  88. idx += len;
  89. return true;
  90. }
  91. }
  92. }