@@ -3,6 +3,9 @@ var sys = require('sys');
33//+ Jonas Raoni Soares Silva
44//@ http://jsfromhell.com/classes/binary-parser [v1.0]
55var chr = String . fromCharCode ;
6+ var maxBits = [ ] ;
7+ for ( var i = 0 ; i < 64 ; i ++ )
8+ maxBits [ i ] = Math . pow ( 2 , i ) ;
69
710var p = exports . BinaryParser = function ( bigEndian , allowExceptions ) {
811this . bigEndian = bigEndian ;
@@ -52,19 +55,23 @@ p.warn = function( msg ){
5255p . decodeFloat = function ( data , precisionBits , exponentBits ) {
5356var b = new this . Buffer ( this . bigEndian , data ) ;
5457b . checkBuffer ( precisionBits + exponentBits + 1 ) ;
55- var bias = Math . pow ( 2 , exponentBits - 1 ) - 1 , signal = b . readBits ( precisionBits + exponentBits , 1 ) , exponent = b . readBits ( precisionBits , exponentBits ) , significand = 0 ,
58+ //var bias = Math.pow( 2, exponentBits - 1 ) - 1,
59+ var bias = maxBits [ exponentBits - 1 ] - 1 ,
60+ signal = b . readBits ( precisionBits + exponentBits , 1 ) , exponent = b . readBits ( precisionBits , exponentBits ) , significand = 0 ,
5661divisor = 2 , curByte = b . buffer . length + ( - precisionBits >> 3 ) - 1 ;
5762do {
5863for ( var byteValue = b . buffer [ ++ curByte ] , startBit = precisionBits % 8 || 8 , mask = 1 << startBit ; mask >>= 1 ; ( byteValue & mask ) && ( significand += 1 / divisor ) , divisor *= 2 ) ;
5964} while ( precisionBits -= startBit ) ;
6065return exponent == ( bias << 1 ) + 1 ? significand ? NaN : signal ? - Infinity : + Infinity : ( 1 + signal * - 2 ) * ( exponent || significand ? ! exponent ? Math . pow ( 2 , - bias + 1 ) * significand : Math . pow ( 2 , exponent - bias ) * ( 1 + significand ) : 0 ) ;
6166} ;
6267p . decodeInt = function ( data , bits , signed , forceBigEndian ) {
63- var b = new this . Buffer ( this . bigEndian || forceBigEndian , data ) , x = b . readBits ( 0 , bits ) , max = Math . pow ( 2 , bits ) ;
68+ var b = new this . Buffer ( this . bigEndian || forceBigEndian , data ) , x = b . readBits ( 0 , bits ) , max = maxBits [ bits ] ; //max = Math.pow( 2, bits );
6469return signed && x >= max / 2 ? x - max : x ;
6570} ;
6671p . encodeFloat = function ( data , precisionBits , exponentBits ) {
67- var bias = Math . pow ( 2 , exponentBits - 1 ) - 1 , minExp = - bias + 1 , maxExp = bias , minUnnormExp = minExp - precisionBits ,
72+ //var bias = Math.pow( 2, exponentBits - 1 ) - 1,
73+ var bias = maxBits [ exponentBits - 1 ] - 1 ,
74+ minExp = - bias + 1 , maxExp = bias , minUnnormExp = minExp - precisionBits ,
6875status = isNaN ( n = parseFloat ( data ) ) || n == - Infinity || n == + Infinity ? n : 0 ,
6976exp = 0 , len = 2 * bias + 1 + precisionBits + 3 , bin = new Array ( len ) ,
7077signal = ( n = status !== 0 ? 0 : n ) < 0 , n = Math . abs ( n ) , intPart = Math . floor ( n ) , floatPart = n - intPart ,
@@ -106,13 +113,17 @@ p.encodeFloat = function( data, precisionBits, exponentBits ){
106113r [ r . length ] = n ? String . fromCharCode ( n ) : "" ;
107114return ( this . bigEndian ? r . reverse ( ) : r ) . join ( "" ) ;
108115} ;
116+
109117p . encodeInt = function ( data , bits , signed , forceBigEndian ) {
110- var max = Math . pow ( 2 , bits ) ;
118+ //var max = Math.pow( 2, bits );
119+ var max = maxBits [ bits ] ;
120+
111121( data >= max || data < - ( max / 2 ) ) && this . warn ( "encodeInt::overflow" ) && ( data = 0 ) ;
112122data < 0 && ( data += max ) ;
113123for ( var r = [ ] ; data ; r [ r . length ] = String . fromCharCode ( data % 256 ) , data = Math . floor ( data / 256 ) ) ;
114124for ( bits = - ( - bits >> 3 ) - r . length ; bits -- ; r [ r . length ] = "\0" ) ;
115- return ( ( this . bigEndian || forceBigEndian ) ? r . reverse ( ) : r ) . join ( "" ) ;
125+
126+ return ( ( this . bigEndian || forceBigEndian ) ? r . reverse ( ) : r ) . join ( "" ) ;
116127} ;
117128p . toSmall = function ( data ) { return this . decodeInt ( data , 8 , true ) ; } ;
118129p . fromSmall = function ( data ) { return this . encodeInt ( data , 8 , true ) ; } ;
0 commit comments