@@ -13,15 +13,19 @@ const isBigEndian = FLOAT_BYTES[7] === 0;
13
13
* A collection of functions that get or set various numeric types and bit widths from a Uint8Array.
14
14
*/
15
15
export type NumberUtils = {
16
- getInt32LE ( source : Uint8Array , offset : number ) : number ;
17
- getUint32LE ( source : Uint8Array , offset : number ) : number ;
18
- getUint32BE ( source : Uint8Array , offset : number ) : number ;
19
- getBigInt64LE ( source : Uint8Array , offset : number ) : bigint ;
20
- getFloat64LE ( source : Uint8Array , offset : number ) : number ;
21
- setInt32BE ( destination : Uint8Array , offset : number , value : number ) : 4 ;
22
- setInt32LE ( destination : Uint8Array , offset : number , value : number ) : 4 ;
23
- setBigInt64LE ( destination : Uint8Array , offset : number , value : bigint ) : 8 ;
24
- setFloat64LE ( destination : Uint8Array , offset : number , value : number ) : 8 ;
16
+ /**
17
+ * Parses a signed int32 at offset. Throws a `RangeError` if value is negative.
18
+ */
19
+ getNonnegativeInt32LE : ( source : Uint8Array , offset : number ) => number ;
20
+ getInt32LE : ( source : Uint8Array , offset : number ) => number ;
21
+ getUint32LE : ( source : Uint8Array , offset : number ) => number ;
22
+ getUint32BE : ( source : Uint8Array , offset : number ) => number ;
23
+ getBigInt64LE : ( source : Uint8Array , offset : number ) => bigint ;
24
+ getFloat64LE : ( source : Uint8Array , offset : number ) => number ;
25
+ setInt32BE : ( destination : Uint8Array , offset : number , value : number ) => 4 ;
26
+ setInt32LE : ( destination : Uint8Array , offset : number , value : number ) => 4 ;
27
+ setBigInt64LE : ( destination : Uint8Array , offset : number , value : bigint ) => 8 ;
28
+ setFloat64LE : ( destination : Uint8Array , offset : number , value : number ) => 8 ;
25
29
} ;
26
30
27
31
/**
@@ -31,6 +35,18 @@ export type NumberUtils = {
31
35
* @public
32
36
*/
33
37
export const NumberUtils : NumberUtils = {
38
+ getNonnegativeInt32LE ( source : Uint8Array , offset : number ) : number {
39
+ if ( source [ offset + 3 ] > 127 ) {
40
+ throw new RangeError ( `Size cannot be negative at offset: ${ offset } ` ) ;
41
+ }
42
+ return (
43
+ source [ offset ] |
44
+ ( source [ offset + 1 ] << 8 ) |
45
+ ( source [ offset + 2 ] << 16 ) |
46
+ ( source [ offset + 3 ] << 24 )
47
+ ) ;
48
+ } ,
49
+
34
50
/** Reads a little-endian 32-bit integer from source */
35
51
getInt32LE ( source : Uint8Array , offset : number ) : number {
36
52
return (
0 commit comments