vid_us_data_reader.dart 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import 'dart:convert';
  2. import 'dart:typed_data';
  3. class VidUsDataReader {
  4. late final ByteBuffer _buffer;
  5. late final int _bufferOffset;
  6. late int _index;
  7. VidUsDataReader(Uint8List data, [int offset = 0]) {
  8. _buffer = data.buffer;
  9. _bufferOffset = data.offsetInBytes;
  10. _index = _bufferOffset + offset;
  11. }
  12. ///Read int value from binary data(little endian),
  13. int readInt([int index = -1]) {
  14. if (index == -1) {
  15. var intData = _buffer.asByteData(_index, 4);
  16. _index += 4;
  17. return intData.getInt32(0, Endian.little);
  18. } else {
  19. var intData = _buffer.asByteData(index, 4);
  20. _index = _bufferOffset + index + 4;
  21. return intData.getInt32(0, Endian.little);
  22. }
  23. }
  24. ///Read string from the binary data, the string format is utf-16, which is unicode in C#
  25. String readString([int index = -1]) {
  26. if (index == -1) {
  27. var dataLength = readInt() ~/ 2;
  28. var stringData = _buffer.asUint16List(index, dataLength);
  29. _index += dataLength;
  30. //return utf8.decode(stringData);
  31. return String.fromCharCodes(stringData);
  32. } else {
  33. var dataLength = readInt(index) ~/ 2;
  34. var stringData = _buffer.asUint16List(_index, dataLength);
  35. _index += dataLength;
  36. //return utf8.decode(stringData);
  37. return String.fromCharCodes(stringData);
  38. }
  39. }
  40. ///Read int16 value from binary data(little endian)
  41. int readInt16([int index = -1]) {
  42. if (index == -1) {
  43. var intData = _buffer.asByteData(_index, 2);
  44. _index += 2;
  45. return intData.getInt16(0, Endian.little);
  46. } else {
  47. var intData = _buffer.asByteData(index, 2);
  48. _index = _bufferOffset + index + 2;
  49. return intData.getInt16(0, Endian.little);
  50. }
  51. }
  52. ///Read int64 value from binary data(little endian)
  53. ///this method is not support in web platform use readInt64V2 instead.
  54. int readInt64([int index = -1]) {
  55. if (index == -1) {
  56. var intData = _buffer.asByteData(_index, 8);
  57. _index += 8;
  58. return intData.getInt64(0, Endian.little);
  59. } else {
  60. var intData = _buffer.asByteData(index, 8);
  61. _index = _bufferOffset + index + 8;
  62. return intData.getInt64(0, Endian.little);
  63. }
  64. }
  65. ///Read int64 value from binary data(little endian)
  66. ///this method use two int32 to support read int64 on web platform
  67. int readInt64V2([int index = -1]) {
  68. if (index == -1) {
  69. int low = readInt();
  70. int high = readInt();
  71. int value = high >> 32;
  72. value |= low;
  73. return value;
  74. } else {
  75. int low = readInt(index);
  76. //Read the next int.
  77. int high = readInt();
  78. int value = high >> 32;
  79. value |= low;
  80. return value;
  81. }
  82. }
  83. ///Read float value from binary data(little endian)
  84. double readFloat([int index = -1]) {
  85. if (index == -1) {
  86. var floatData = _buffer.asByteData(_index, 4);
  87. _index += 4;
  88. return floatData.getFloat32(0, Endian.little);
  89. } else {
  90. var floatData = _buffer.asByteData(index, 4);
  91. _index = _bufferOffset + index + 4;
  92. return floatData.getFloat32(0, Endian.little);
  93. }
  94. }
  95. ///Read double value from binary data(little endian)
  96. double readDouble([int index = -1]) {
  97. if (index == -1) {
  98. var floatData = _buffer.asByteData(_index, 8);
  99. _index += 8;
  100. return floatData.getFloat64(0, Endian.little);
  101. } else {
  102. var floatData = _buffer.asByteData(index, 8);
  103. _index = _bufferOffset + index + 8;
  104. return floatData.getFloat64(0, Endian.little);
  105. }
  106. }
  107. ///Read bool value from binary data
  108. bool readBool([int index = -1]) {
  109. if (index == -1) {
  110. var boolData = _buffer.asByteData(_index, 1);
  111. _index++;
  112. return boolData.getInt8(0) == 1;
  113. } else {
  114. var boolData = _buffer.asByteData(index, 1);
  115. _index = _bufferOffset + index + 1;
  116. return boolData.getInt8(0) == 1;
  117. }
  118. }
  119. ///Read byte value from binary data
  120. int readByte([int index = -1]) {
  121. if (index == -1) {
  122. var byteData = _buffer.asByteData(_index, 1);
  123. _index++;
  124. return byteData.getInt8(0);
  125. } else {
  126. var byteData = _buffer.asByteData(index, 1);
  127. _index = _bufferOffset + index + 1;
  128. return byteData.getInt8(0);
  129. }
  130. }
  131. ///Read bytes from the binary data.
  132. Uint8List readBytes([int index = -1]) {
  133. var dataLength = readInt(index);
  134. var bytes = _buffer.asUint8List(_index, dataLength);
  135. _index += dataLength;
  136. return bytes;
  137. }
  138. }