|
1 | 1 | const FLOAT = new Float64Array(1);
|
2 | 2 | const FLOAT_BYTES = new Uint8Array(FLOAT.buffer, 0, 8);
|
3 | 3 |
|
| 4 | +FLOAT[0] = -1; |
| 5 | +// Little endian [0, 0, 0, 0, 0, 0, 240, 191] |
| 6 | +// Big endian [191, 240, 0, 0, 0, 0, 0, 0] |
| 7 | +const isBigEndian = FLOAT_BYTES[7] === 0; |
| 8 | + |
4 | 9 | /**
|
5 | 10 | * Number parsing and serializing utilities.
|
6 | 11 | *
|
@@ -50,17 +55,29 @@ export const NumberUtils = {
|
50 | 55 | },
|
51 | 56 |
|
52 | 57 | /** Reads a little-endian 64-bit float from source */
|
53 |
| - getFloat64LE(source: Uint8Array, offset: number): number { |
54 |
| - FLOAT_BYTES[0] = source[offset]; |
55 |
| - FLOAT_BYTES[1] = source[offset + 1]; |
56 |
| - FLOAT_BYTES[2] = source[offset + 2]; |
57 |
| - FLOAT_BYTES[3] = source[offset + 3]; |
58 |
| - FLOAT_BYTES[4] = source[offset + 4]; |
59 |
| - FLOAT_BYTES[5] = source[offset + 5]; |
60 |
| - FLOAT_BYTES[6] = source[offset + 6]; |
61 |
| - FLOAT_BYTES[7] = source[offset + 7]; |
62 |
| - return FLOAT[0]; |
63 |
| - }, |
| 58 | + getFloat64LE: isBigEndian |
| 59 | + ? (source: Uint8Array, offset: number) => { |
| 60 | + FLOAT_BYTES[7] = source[offset]; |
| 61 | + FLOAT_BYTES[6] = source[offset + 1]; |
| 62 | + FLOAT_BYTES[5] = source[offset + 2]; |
| 63 | + FLOAT_BYTES[4] = source[offset + 3]; |
| 64 | + FLOAT_BYTES[3] = source[offset + 4]; |
| 65 | + FLOAT_BYTES[2] = source[offset + 5]; |
| 66 | + FLOAT_BYTES[1] = source[offset + 6]; |
| 67 | + FLOAT_BYTES[0] = source[offset + 7]; |
| 68 | + return FLOAT[0]; |
| 69 | + } |
| 70 | + : (source: Uint8Array, offset: number) => { |
| 71 | + FLOAT_BYTES[0] = source[offset]; |
| 72 | + FLOAT_BYTES[1] = source[offset + 1]; |
| 73 | + FLOAT_BYTES[2] = source[offset + 2]; |
| 74 | + FLOAT_BYTES[3] = source[offset + 3]; |
| 75 | + FLOAT_BYTES[4] = source[offset + 4]; |
| 76 | + FLOAT_BYTES[5] = source[offset + 5]; |
| 77 | + FLOAT_BYTES[6] = source[offset + 6]; |
| 78 | + FLOAT_BYTES[7] = source[offset + 7]; |
| 79 | + return FLOAT[0]; |
| 80 | + }, |
64 | 81 |
|
65 | 82 | /** Writes a big-endian 32-bit integer to destination, can be signed or unsigned */
|
66 | 83 | setInt32BE(destination: Uint8Array, offset: number, value: number): 4 {
|
@@ -120,16 +137,29 @@ export const NumberUtils = {
|
120 | 137 | },
|
121 | 138 |
|
122 | 139 | /** Writes a little-endian 64-bit float to destination */
|
123 |
| - setFloat64LE(destination: Uint8Array, offset: number, value: number): 8 { |
124 |
| - FLOAT[0] = value; |
125 |
| - destination[offset] = FLOAT_BYTES[0]; |
126 |
| - destination[offset + 1] = FLOAT_BYTES[1]; |
127 |
| - destination[offset + 2] = FLOAT_BYTES[2]; |
128 |
| - destination[offset + 3] = FLOAT_BYTES[3]; |
129 |
| - destination[offset + 4] = FLOAT_BYTES[4]; |
130 |
| - destination[offset + 5] = FLOAT_BYTES[5]; |
131 |
| - destination[offset + 6] = FLOAT_BYTES[6]; |
132 |
| - destination[offset + 7] = FLOAT_BYTES[7]; |
133 |
| - return 8; |
134 |
| - } |
| 140 | + setFloat64LE: isBigEndian |
| 141 | + ? (destination: Uint8Array, offset: number, value: number) => { |
| 142 | + FLOAT[0] = value; |
| 143 | + destination[offset] = FLOAT_BYTES[7]; |
| 144 | + destination[offset + 1] = FLOAT_BYTES[6]; |
| 145 | + destination[offset + 2] = FLOAT_BYTES[5]; |
| 146 | + destination[offset + 3] = FLOAT_BYTES[4]; |
| 147 | + destination[offset + 4] = FLOAT_BYTES[3]; |
| 148 | + destination[offset + 5] = FLOAT_BYTES[2]; |
| 149 | + destination[offset + 6] = FLOAT_BYTES[1]; |
| 150 | + destination[offset + 7] = FLOAT_BYTES[0]; |
| 151 | + return 8; |
| 152 | + } |
| 153 | + : (destination: Uint8Array, offset: number, value: number) => { |
| 154 | + FLOAT[0] = value; |
| 155 | + destination[offset] = FLOAT_BYTES[0]; |
| 156 | + destination[offset + 1] = FLOAT_BYTES[1]; |
| 157 | + destination[offset + 2] = FLOAT_BYTES[2]; |
| 158 | + destination[offset + 3] = FLOAT_BYTES[3]; |
| 159 | + destination[offset + 4] = FLOAT_BYTES[4]; |
| 160 | + destination[offset + 5] = FLOAT_BYTES[5]; |
| 161 | + destination[offset + 6] = FLOAT_BYTES[6]; |
| 162 | + destination[offset + 7] = FLOAT_BYTES[7]; |
| 163 | + return 8; |
| 164 | + } |
135 | 165 | };
|
0 commit comments