|
1 | | -// the actual range is int53 (a.k.a. safe integer) |
2 | | -export function encodeUint64(value: number, view: DataView, offset: number): void { |
3 | | - const high = value / 0x100000000; |
4 | | - const low = value & 0xffffffff; |
| 1 | +// the actual range is 53-bits integer (a.k.a. safe integer) |
5 | 2 |
|
| 3 | +export function setUint64(view: DataView, offset: number, value: number): void { |
| 4 | + const high = value / 0x1_0000_0000; |
| 5 | + const low = value; // high bits are truncated by DataView |
6 | 6 | view.setUint32(offset, high); |
7 | 7 | view.setUint32(offset + 4, low); |
8 | 8 | } |
9 | 9 |
|
10 | 10 | // the actual range is int53 (a.k.a. safe integer) |
11 | | -export function encodeInt64(value: number, view: DataView, offset: number): void { |
12 | | - if (value < 0) { |
13 | | - const absMinusOne = -value - 1; |
14 | | - const high = absMinusOne / 0x1_0000_0000; |
15 | | - const low = absMinusOne & 0xffff_ffff; |
| 11 | +export function setInt64(view: DataView, offset: number, value: number): void { |
| 12 | + const high = Math.floor(value / 0x1_0000_0000); |
| 13 | + const low = value; // high bits are truncated by DataView |
| 14 | + view.setUint32(offset, high); |
| 15 | + view.setUint32(offset + 4, low); |
| 16 | +} |
16 | 17 |
|
17 | | - view.setUint32(offset, (high ^ 0xffff_ffff) | 0x8000_0000); |
18 | | - view.setUint32(offset + 4, low ^ 0xffff_ffff); |
19 | | - } else { |
20 | | - encodeUint64(value, view, offset); |
21 | | - } |
| 18 | +export function getInt64(view: DataView, offset: number) { |
| 19 | + const high = view.getInt32(offset); |
| 20 | + const low = view.getUint32(offset + 4); |
| 21 | + return high * 0x1_0000_0000 + low; |
22 | 22 | } |
23 | 23 |
|
24 | | -// the actual range is int53 (a.k.a. safe integer) |
25 | | -export function decodeInt64( |
26 | | - b1: number, |
27 | | - b2: number, |
28 | | - b3: number, |
29 | | - b4: number, |
30 | | - b5: number, |
31 | | - b6: number, |
32 | | - b7: number, |
33 | | - b8: number, |
34 | | -): number { |
35 | | - if (b1 & 0x80) { |
36 | | - // to avoid overflow |
37 | | - return -( |
38 | | - (b1 ^ 0xff) * 0x100000000000000 + |
39 | | - (b2 ^ 0xff) * 0x1000000000000 + |
40 | | - (b3 ^ 0xff) * 0x10000000000 + |
41 | | - (b4 ^ 0xff) * 0x100000000 + |
42 | | - (b5 ^ 0xff) * 0x1000000 + |
43 | | - (b6 ^ 0xff) * 0x10000 + |
44 | | - (b7 ^ 0xff) * 0x100 + |
45 | | - (b8 ^ 0xff) + |
46 | | - 1 |
47 | | - ); |
48 | | - } |
49 | | - return ( |
50 | | - b1 * 0x100000000000000 + |
51 | | - b2 * 0x1000000000000 + |
52 | | - b3 * 0x10000000000 + |
53 | | - b4 * 0x100000000 + |
54 | | - b5 * 0x1000000 + |
55 | | - b6 * 0x10000 + |
56 | | - b7 * 0x100 + |
57 | | - b8 |
58 | | - ); |
| 24 | +export function getUint64(view: DataView, offset: number) { |
| 25 | + const high = view.getUint32(offset); |
| 26 | + const low = view.getUint32(offset + 4); |
| 27 | + return high * 0x1_0000_0000 + low; |
59 | 28 | } |
0 commit comments