@@ -13,15 +13,19 @@ const isBigEndian = FLOAT_BYTES[7] === 0;
1313 * A collection of functions that get or set various numeric types and bit widths from a Uint8Array.
1414 */
1515export 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 ;
2529} ;
2630
2731/**
@@ -31,6 +35,18 @@ export type NumberUtils = {
3135 * @public
3236 */
3337export 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+
3450 /** Reads a little-endian 32-bit integer from source */
3551 getInt32LE ( source : Uint8Array , offset : number ) : number {
3652 return (
0 commit comments