1
- var parseBits = function ( data , bits , offset , callback ) {
1
+ var parseBits = function ( data , bits , offset , invert , callback ) {
2
2
offset = offset || 0 ;
3
+ invert = invert || false ;
3
4
callback = callback || function ( lastValue , newValue , bits ) { return ( lastValue * Math . pow ( 2 , bits ) ) + newValue ; } ;
4
5
var offsetBytes = offset >> 3 ;
5
6
7
+ var inv = function ( value ) {
8
+ if ( invert ) {
9
+ return ~ value & 0xff ;
10
+ }
11
+
12
+ return value ;
13
+ } ;
14
+
6
15
// read first (maybe partial) byte
7
16
var mask = 0xff ;
8
17
var firstBits = 8 - ( offset % 8 ) ;
@@ -17,19 +26,19 @@ var parseBits = function(data, bits, offset, callback) {
17
26
18
27
var result = 0 ;
19
28
if ( ( offset % 8 ) + bits >= 8 ) {
20
- result = callback ( 0 , data [ offsetBytes ] & mask , firstBits ) ;
29
+ result = callback ( 0 , inv ( data [ offsetBytes ] ) & mask , firstBits ) ;
21
30
}
22
31
23
32
// read bytes
24
33
var bytes = ( bits + offset ) >> 3 ;
25
34
for ( var i = offsetBytes + 1 ; i < bytes ; i ++ ) {
26
- result = callback ( result , data [ i ] , 8 ) ;
35
+ result = callback ( result , inv ( data [ i ] ) , 8 ) ;
27
36
}
28
37
29
38
// bits to read, that are not a complete byte
30
39
var lastBits = ( bits + offset ) % 8 ;
31
40
if ( lastBits > 0 ) {
32
- result = callback ( result , data [ bytes ] >> ( 8 - lastBits ) , lastBits ) ;
41
+ result = callback ( result , inv ( data [ bytes ] ) >> ( 8 - lastBits ) , lastBits ) ;
33
42
}
34
43
35
44
return result ;
@@ -60,7 +69,7 @@ var parseFloatFromBits = function(data, precisionBits, exponentBits) {
60
69
return lastValue ;
61
70
} ;
62
71
63
- var mantissa = parseBits ( data , precisionBits , exponentBits + 1 , parsePrecisionBits ) ;
72
+ var mantissa = parseBits ( data , precisionBits , exponentBits + 1 , false , parsePrecisionBits ) ;
64
73
65
74
// special cases
66
75
if ( exponent == ( Math . pow ( 2 , exponentBits + 1 ) - 1 ) ) {
@@ -81,23 +90,23 @@ var parseBool = function(value) {
81
90
82
91
var parseInt16 = function ( value ) {
83
92
if ( parseBits ( value , 1 ) == 1 ) {
84
- return - 1 * ( Math . pow ( 2 , 15 ) - parseBits ( value , 15 , 1 ) ) ;
93
+ return - 1 * ( parseBits ( value , 15 , 1 , true ) + 1 ) ;
85
94
}
86
95
87
96
return parseBits ( value , 15 , 1 ) ;
88
97
} ;
89
98
90
99
var parseInt32 = function ( value ) {
91
100
if ( parseBits ( value , 1 ) == 1 ) {
92
- return - 1 * ( Math . pow ( 2 , 31 ) - parseBits ( value , 31 , 1 ) ) ;
101
+ return - 1 * ( parseBits ( value , 31 , 1 , true ) + 1 ) ;
93
102
}
94
103
95
104
return parseBits ( value , 31 , 1 ) ;
96
105
} ;
97
106
98
107
var parseInt64 = function ( value ) {
99
108
if ( parseBits ( value , 1 ) == 1 ) {
100
- return - 1 * ( Math . pow ( 2 , 63 ) - parseBits ( value , 63 , 1 ) ) ;
109
+ return - 1 * ( parseBits ( value , 63 , 1 , true ) + 1 ) ;
101
110
}
102
111
103
112
return parseBits ( value , 63 , 1 ) ;
0 commit comments