dataview64.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const float16_1 = require("@petamoriken/float16");
  4. class DataView64 {
  5. constructor(arrayBuffer) {
  6. this._dataView = new DataView(arrayBuffer);
  7. }
  8. get buffer() {
  9. return this._dataView.buffer;
  10. }
  11. getUint64(offset, littleEndian) {
  12. const left = this.getUint32(offset, littleEndian);
  13. const right = this.getUint32(offset + 4, littleEndian);
  14. let combined;
  15. if (littleEndian) {
  16. combined = left + ((2 ** 32) * right);
  17. if (!Number.isSafeInteger(combined)) {
  18. throw new Error(`${combined} exceeds MAX_SAFE_INTEGER. `
  19. + 'Precision may be lost. Please report if you get this message to https://github.com/geotiffjs/geotiff.js/issues');
  20. }
  21. return combined;
  22. }
  23. combined = ((2 ** 32) * left) + right;
  24. if (!Number.isSafeInteger(combined)) {
  25. throw new Error(`${combined} exceeds MAX_SAFE_INTEGER. `
  26. + 'Precision may be lost. Please report if you get this message to https://github.com/geotiffjs/geotiff.js/issues');
  27. }
  28. return combined;
  29. }
  30. // adapted from https://stackoverflow.com/a/55338384/8060591
  31. getInt64(offset, littleEndian) {
  32. let value = 0;
  33. const isNegative = (this._dataView.getUint8(offset + (littleEndian ? 7 : 0)) & 0x80) > 0;
  34. let carrying = true;
  35. for (let i = 0; i < 8; i++) {
  36. let byte = this._dataView.getUint8(offset + (littleEndian ? i : 7 - i));
  37. if (isNegative) {
  38. if (carrying) {
  39. if (byte !== 0x00) {
  40. byte = ~(byte - 1) & 0xff;
  41. carrying = false;
  42. }
  43. }
  44. else {
  45. byte = ~byte & 0xff;
  46. }
  47. }
  48. value += byte * (256 ** i);
  49. }
  50. if (isNegative) {
  51. value = -value;
  52. }
  53. return value;
  54. }
  55. getUint8(offset, littleEndian) {
  56. return this._dataView.getUint8(offset, littleEndian);
  57. }
  58. getInt8(offset, littleEndian) {
  59. return this._dataView.getInt8(offset, littleEndian);
  60. }
  61. getUint16(offset, littleEndian) {
  62. return this._dataView.getUint16(offset, littleEndian);
  63. }
  64. getInt16(offset, littleEndian) {
  65. return this._dataView.getInt16(offset, littleEndian);
  66. }
  67. getUint32(offset, littleEndian) {
  68. return this._dataView.getUint32(offset, littleEndian);
  69. }
  70. getInt32(offset, littleEndian) {
  71. return this._dataView.getInt32(offset, littleEndian);
  72. }
  73. getFloat16(offset, littleEndian) {
  74. return (0, float16_1.getFloat16)(this._dataView, offset, littleEndian);
  75. }
  76. getFloat32(offset, littleEndian) {
  77. return this._dataView.getFloat32(offset, littleEndian);
  78. }
  79. getFloat64(offset, littleEndian) {
  80. return this._dataView.getFloat64(offset, littleEndian);
  81. }
  82. }
  83. exports.default = DataView64;
  84. //# sourceMappingURL=dataview64.js.map