|
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 | *
|
@@ -59,17 +64,29 @@ export const NumberUtils = {
|
59 | 64 | },
|
60 | 65 |
|
61 | 66 | /** Reads a little-endian 64-bit float from source */
|
62 |
| - getFloat64LE(source: Uint8Array, offset: number): number { |
63 |
| - FLOAT_BYTES[0] = source[offset]; |
64 |
| - FLOAT_BYTES[1] = source[offset + 1]; |
65 |
| - FLOAT_BYTES[2] = source[offset + 2]; |
66 |
| - FLOAT_BYTES[3] = source[offset + 3]; |
67 |
| - FLOAT_BYTES[4] = source[offset + 4]; |
68 |
| - FLOAT_BYTES[5] = source[offset + 5]; |
69 |
| - FLOAT_BYTES[6] = source[offset + 6]; |
70 |
| - FLOAT_BYTES[7] = source[offset + 7]; |
71 |
| - return FLOAT[0]; |
72 |
| - }, |
| 67 | + getFloat64LE: isBigEndian |
| 68 | + ? (source: Uint8Array, offset: number) => { |
| 69 | + FLOAT_BYTES[7] = source[offset]; |
| 70 | + FLOAT_BYTES[6] = source[offset + 1]; |
| 71 | + FLOAT_BYTES[5] = source[offset + 2]; |
| 72 | + FLOAT_BYTES[4] = source[offset + 3]; |
| 73 | + FLOAT_BYTES[3] = source[offset + 4]; |
| 74 | + FLOAT_BYTES[2] = source[offset + 5]; |
| 75 | + FLOAT_BYTES[1] = source[offset + 6]; |
| 76 | + FLOAT_BYTES[0] = source[offset + 7]; |
| 77 | + return FLOAT[0]; |
| 78 | + } |
| 79 | + : (source: Uint8Array, offset: number) => { |
| 80 | + FLOAT_BYTES[0] = source[offset]; |
| 81 | + FLOAT_BYTES[1] = source[offset + 1]; |
| 82 | + FLOAT_BYTES[2] = source[offset + 2]; |
| 83 | + FLOAT_BYTES[3] = source[offset + 3]; |
| 84 | + FLOAT_BYTES[4] = source[offset + 4]; |
| 85 | + FLOAT_BYTES[5] = source[offset + 5]; |
| 86 | + FLOAT_BYTES[6] = source[offset + 6]; |
| 87 | + FLOAT_BYTES[7] = source[offset + 7]; |
| 88 | + return FLOAT[0]; |
| 89 | + }, |
73 | 90 |
|
74 | 91 | /** Writes a big-endian 32-bit integer to destination, can be signed or unsigned */
|
75 | 92 | setInt32BE(destination: Uint8Array, offset: number, value: number): 4 {
|
@@ -129,16 +146,29 @@ export const NumberUtils = {
|
129 | 146 | },
|
130 | 147 |
|
131 | 148 | /** Writes a little-endian 64-bit float to destination */
|
132 |
| - setFloat64LE(destination: Uint8Array, offset: number, value: number): 8 { |
133 |
| - FLOAT[0] = value; |
134 |
| - destination[offset] = FLOAT_BYTES[0]; |
135 |
| - destination[offset + 1] = FLOAT_BYTES[1]; |
136 |
| - destination[offset + 2] = FLOAT_BYTES[2]; |
137 |
| - destination[offset + 3] = FLOAT_BYTES[3]; |
138 |
| - destination[offset + 4] = FLOAT_BYTES[4]; |
139 |
| - destination[offset + 5] = FLOAT_BYTES[5]; |
140 |
| - destination[offset + 6] = FLOAT_BYTES[6]; |
141 |
| - destination[offset + 7] = FLOAT_BYTES[7]; |
142 |
| - return 8; |
143 |
| - } |
| 149 | + setFloat64LE: isBigEndian |
| 150 | + ? (destination: Uint8Array, offset: number, value: number) => { |
| 151 | + FLOAT[0] = value; |
| 152 | + destination[offset] = FLOAT_BYTES[7]; |
| 153 | + destination[offset + 1] = FLOAT_BYTES[6]; |
| 154 | + destination[offset + 2] = FLOAT_BYTES[5]; |
| 155 | + destination[offset + 3] = FLOAT_BYTES[4]; |
| 156 | + destination[offset + 4] = FLOAT_BYTES[3]; |
| 157 | + destination[offset + 5] = FLOAT_BYTES[2]; |
| 158 | + destination[offset + 6] = FLOAT_BYTES[1]; |
| 159 | + destination[offset + 7] = FLOAT_BYTES[0]; |
| 160 | + return 8; |
| 161 | + } |
| 162 | + : (destination: Uint8Array, offset: number, value: number) => { |
| 163 | + FLOAT[0] = value; |
| 164 | + destination[offset] = FLOAT_BYTES[0]; |
| 165 | + destination[offset + 1] = FLOAT_BYTES[1]; |
| 166 | + destination[offset + 2] = FLOAT_BYTES[2]; |
| 167 | + destination[offset + 3] = FLOAT_BYTES[3]; |
| 168 | + destination[offset + 4] = FLOAT_BYTES[4]; |
| 169 | + destination[offset + 5] = FLOAT_BYTES[5]; |
| 170 | + destination[offset + 6] = FLOAT_BYTES[6]; |
| 171 | + destination[offset + 7] = FLOAT_BYTES[7]; |
| 172 | + return 8; |
| 173 | + } |
144 | 174 | };
|
0 commit comments