@evshiron/exifr
Version:
📷 The fastest and most versatile JavaScript EXIF reading library.
27 lines (23 loc) • 1.31 kB
JavaScript
import {BufferView} from './BufferView.mjs'
import {BigInt} from '../util/platform.mjs'
import {throwError} from '../util/helpers.mjs'
const FULL_20_BITS = 0b11111111111111111111
BufferView.prototype.getUint64 = function(offset) {
let part1 = this.getUint32(offset)
let part2 = this.getUint32(offset + 4)
if (part1 < FULL_20_BITS) {
// Warning: JS cannot handle 64-bit integers. The number will overflow and cause unexpected result
// if the number is larger than 53. We try to handle numbers up to 52 bits. 32+21 = 53 out of which
// one bit is needed for sign. Becase js only does 32 unsinged int (through bitwise operators).
return (part1 << 32) | part2
} else if (typeof BigInt !== undefined) {
// If the environment supports BigInt we'll try to use it. Though it may break user functionality
// (for example can't do mixed math with numbers & bigints)
console.warn(`Using BigInt because of type 64uint but JS can only handle 53b numbers.`)
return (BigInt(part1) << BigInt(32)) | BigInt(part2)
} else {
// The value (when both 32b parts combined) is larger than 53 bits so we can't just use Number type
// and this environment doesn't support BigInt... throw error.
throwError(`Trying to read 64b value but JS can only handle 53b numbers.`)
}
}