diff options
Diffstat (limited to '')
-rw-r--r-- | js/binaryXHR.js | 91 |
1 files changed, 43 insertions, 48 deletions
diff --git a/js/binaryXHR.js b/js/binaryXHR.js index 8ce4b0f..2cd02dd 100644 --- a/js/binaryXHR.js +++ b/js/binaryXHR.js | |||
@@ -33,12 +33,8 @@ InvalidBinaryFile.prototype.toString = function() { | |||
33 | function BinaryFile(data) { | 33 | function BinaryFile(data) { |
34 | "use strict"; | 34 | "use strict"; |
35 | var dataLength; | 35 | var dataLength; |
36 | // added | 36 | // whether the data is in little endian format |
37 | var doubleMantExpHi=Math.pow(2,-28); | 37 | var littleEndian = true; |
38 | var doubleMantExpLo=Math.pow(2,-52); | ||
39 | var doubleMantExpFast=Math.pow(2,-20); | ||
40 | |||
41 | var switch_endian = false; | ||
42 | 38 | ||
43 | this.getRawData = function() { | 39 | this.getRawData = function() { |
44 | return data; | 40 | return data; |
@@ -61,20 +57,32 @@ function BinaryFile(data) { | |||
61 | throw new InvalidBinaryFile("Unsupported type " + (typeof data)); | 57 | throw new InvalidBinaryFile("Unsupported type " + (typeof data)); |
62 | } | 58 | } |
63 | 59 | ||
64 | if (switch_endian) { | 60 | this.getLength = function() { |
65 | this.getEndianByteAt = function(iOffset, width, delta) { | 61 | return dataLength; |
66 | return this.getByteAt(iOffset + width - delta - 1); | 62 | }; |
63 | |||
64 | // antique browser, use slower fallback implementation | ||
65 | this.extendWithFallback(data, littleEndian); | ||
66 | } | ||
67 | |||
68 | BinaryFile.prototype.extendWithFallback = function(data, littleEndian) { | ||
69 | "use strict"; | ||
70 | var doubleMantExpHi = Math.pow(2,-28); | ||
71 | var doubleMantExpLo = Math.pow(2,-52); | ||
72 | var doubleMantExpFast = Math.pow(2,-20); | ||
73 | |||
74 | // private function for getting bytes depending on endianess | ||
75 | var that = this, getEndianByteAt; | ||
76 | if (littleEndian) { | ||
77 | getEndianByteAt = function(iOffset, width, delta) { | ||
78 | return that.getByteAt(iOffset + delta); | ||
67 | }; | 79 | }; |
68 | } else { | 80 | } else { |
69 | this.getEndianByteAt = function(iOffset, width, delta) { | 81 | getEndianByteAt = function(iOffset, width, delta) { |
70 | return this.getByteAt(iOffset + delta); | 82 | return that.getByteAt(iOffset + width - delta - 1); |
71 | }; | 83 | }; |
72 | } | 84 | } |
73 | 85 | ||
74 | this.getLength = function() { | ||
75 | return dataLength; | ||
76 | }; | ||
77 | |||
78 | this.getSByteAt = function(iOffset) { | 86 | this.getSByteAt = function(iOffset) { |
79 | var iByte = this.getByteAt(iOffset); | 87 | var iByte = this.getByteAt(iOffset); |
80 | if (iByte > 127) | 88 | if (iByte > 127) |
@@ -82,9 +90,8 @@ function BinaryFile(data) { | |||
82 | else | 90 | else |
83 | return iByte; | 91 | return iByte; |
84 | }; | 92 | }; |
85 | |||
86 | this.getShortAt = function(iOffset) { | 93 | this.getShortAt = function(iOffset) { |
87 | var iShort = (this.getEndianByteAt(iOffset,2,1) << 8) + this.getEndianByteAt(iOffset,2,0); | 94 | var iShort = (getEndianByteAt(iOffset,2,1) << 8) + getEndianByteAt(iOffset,2,0); |
88 | if (iShort < 0) iShort += 65536; | 95 | if (iShort < 0) iShort += 65536; |
89 | return iShort; | 96 | return iShort; |
90 | }; | 97 | }; |
@@ -96,10 +103,10 @@ function BinaryFile(data) { | |||
96 | return iUShort; | 103 | return iUShort; |
97 | }; | 104 | }; |
98 | this.getLongAt = function(iOffset) { | 105 | this.getLongAt = function(iOffset) { |
99 | var iByte1 = this.getEndianByteAt(iOffset,4,0), | 106 | var iByte1 = getEndianByteAt(iOffset,4,0), |
100 | iByte2 = this.getEndianByteAt(iOffset,4,1), | 107 | iByte2 = getEndianByteAt(iOffset,4,1), |
101 | iByte3 = this.getEndianByteAt(iOffset,4,2), | 108 | iByte3 = getEndianByteAt(iOffset,4,2), |
102 | iByte4 = this.getEndianByteAt(iOffset,4,3); | 109 | iByte4 = getEndianByteAt(iOffset,4,3); |
103 | 110 | ||
104 | var iLong = (((((iByte4 << 8) + iByte3) << 8) + iByte2) << 8) + iByte1; | 111 | var iLong = (((((iByte4 << 8) + iByte3) << 8) + iByte2) << 8) + iByte1; |
105 | if (iLong < 0) iLong += 4294967296; | 112 | if (iLong < 0) iLong += 4294967296; |
@@ -112,15 +119,9 @@ function BinaryFile(data) { | |||
112 | else | 119 | else |
113 | return iULong; | 120 | return iULong; |
114 | }; | 121 | }; |
115 | this.getStringAt = function(iOffset, iLength) { | 122 | this.getCharAt = function(iOffset) { |
116 | var aStr = []; | 123 | return String.fromCharCode(this.getByteAt(iOffset)); |
117 | for (var i=iOffset,j=0;i<iOffset+iLength;i++,j++) { | ||
118 | aStr[j] = String.fromCharCode(this.getByteAt(i)); | ||
119 | } | ||
120 | return aStr.join(""); | ||
121 | }; | 124 | }; |
122 | |||
123 | // Added | ||
124 | this.getCStringAt = function(iOffset, iMaxLength) { | 125 | this.getCStringAt = function(iOffset, iMaxLength) { |
125 | var aStr = []; | 126 | var aStr = []; |
126 | for (var i=iOffset,j=0;(i<iOffset+iMaxLength) && (this.getByteAt(i)>0);i++,j++) { | 127 | for (var i=iOffset,j=0;(i<iOffset+iMaxLength) && (this.getByteAt(i)>0);i++,j++) { |
@@ -128,17 +129,15 @@ function BinaryFile(data) { | |||
128 | } | 129 | } |
129 | return aStr.join(""); | 130 | return aStr.join(""); |
130 | }; | 131 | }; |
131 | |||
132 | // Added | ||
133 | this.getDoubleAt = function(iOffset) { | 132 | this.getDoubleAt = function(iOffset) { |
134 | var iByte1 = this.getEndianByteAt(iOffset,8,0), | 133 | var iByte1 = getEndianByteAt(iOffset,8,0), |
135 | iByte2 = this.getEndianByteAt(iOffset,8,1), | 134 | iByte2 = getEndianByteAt(iOffset,8,1), |
136 | iByte3 = this.getEndianByteAt(iOffset,8,2), | 135 | iByte3 = getEndianByteAt(iOffset,8,2), |
137 | iByte4 = this.getEndianByteAt(iOffset,8,3), | 136 | iByte4 = getEndianByteAt(iOffset,8,3), |
138 | iByte5 = this.getEndianByteAt(iOffset,8,4), | 137 | iByte5 = getEndianByteAt(iOffset,8,4), |
139 | iByte6 = this.getEndianByteAt(iOffset,8,5), | 138 | iByte6 = getEndianByteAt(iOffset,8,5), |
140 | iByte7 = this.getEndianByteAt(iOffset,8,6), | 139 | iByte7 = getEndianByteAt(iOffset,8,6), |
141 | iByte8 = this.getEndianByteAt(iOffset,8,7); | 140 | iByte8 = getEndianByteAt(iOffset,8,7); |
142 | var iSign=iByte8 >> 7; | 141 | var iSign=iByte8 >> 7; |
143 | var iExpRaw=((iByte8 & 0x7F)<< 4) + (iByte7 >> 4); | 142 | var iExpRaw=((iByte8 & 0x7F)<< 4) + (iByte7 >> 4); |
144 | var iMantHi=((((((iByte7 & 0x0F) << 8) + iByte6) << 8) + iByte5) << 8) + iByte4; | 143 | var iMantHi=((((((iByte7 & 0x0F) << 8) + iByte6) << 8) + iByte5) << 8) + iByte4; |
@@ -152,13 +151,12 @@ function BinaryFile(data) { | |||
152 | var dDouble = ((iSign==1)?-1:1)*Math.pow(2,iExp)*(1.0 + iMantLo*doubleMantExpLo + iMantHi*doubleMantExpHi); | 151 | var dDouble = ((iSign==1)?-1:1)*Math.pow(2,iExp)*(1.0 + iMantLo*doubleMantExpLo + iMantHi*doubleMantExpHi); |
153 | return dDouble; | 152 | return dDouble; |
154 | }; | 153 | }; |
155 | // added | ||
156 | // Extracts only 4 bytes out of 8, loosing in precision (20 bit mantissa) | 154 | // Extracts only 4 bytes out of 8, loosing in precision (20 bit mantissa) |
157 | this.getFastDoubleAt = function(iOffset) { | 155 | this.getFastDoubleAt = function(iOffset) { |
158 | var iByte5 = this.getEndianByteAt(iOffset,8,4), | 156 | var iByte5 = getEndianByteAt(iOffset,8,4), |
159 | iByte6 = this.getEndianByteAt(iOffset,8,5), | 157 | iByte6 = getEndianByteAt(iOffset,8,5), |
160 | iByte7 = this.getEndianByteAt(iOffset,8,6), | 158 | iByte7 = getEndianByteAt(iOffset,8,6), |
161 | iByte8 = this.getEndianByteAt(iOffset,8,7); | 159 | iByte8 = getEndianByteAt(iOffset,8,7); |
162 | var iSign=iByte8 >> 7; | 160 | var iSign=iByte8 >> 7; |
163 | var iExpRaw=((iByte8 & 0x7F)<< 4) + (iByte7 >> 4); | 161 | var iExpRaw=((iByte8 & 0x7F)<< 4) + (iByte7 >> 4); |
164 | var iMant=((((iByte7 & 0x0F) << 8) + iByte6) << 8) + iByte5; | 162 | var iMant=((((iByte7 & 0x0F) << 8) + iByte6) << 8) + iByte5; |
@@ -172,11 +170,8 @@ function BinaryFile(data) { | |||
172 | dDouble *= Math.pow(2,iExp) * (1.0 + iMant*doubleMantExpFast); | 170 | dDouble *= Math.pow(2,iExp) * (1.0 + iMant*doubleMantExpFast); |
173 | return dDouble; | 171 | return dDouble; |
174 | }; | 172 | }; |
173 | }; | ||
175 | 174 | ||
176 | this.getCharAt = function(iOffset) { | ||
177 | return String.fromCharCode(this.getByteAt(iOffset)); | ||
178 | }; | ||
179 | } | ||
180 | 175 | ||
181 | 176 | ||
182 | // Use document.write only for stone-age browsers. | 177 | // Use document.write only for stone-age browsers. |