bitcoin-atm
bitcoin atm for pyc inc.
git clone https://9o.is/git/bitcoin-atm.git
databr.js
(9586B)
1 /*
2 Ported to JavaScript by Lazar Laszlo 2011
3
4 lazarsoft@gmail.com, www.lazarsoft.info
5
6 */
7
8 /*
9 *
10 * Copyright 2007 ZXing authors
11 *
12 * Licensed under the Apache License, Version 2.0 (the "License");
13 * you may not use this file except in compliance with the License.
14 * You may obtain a copy of the License at
15 *
16 * http://www.apache.org/licenses/LICENSE-2.0
17 *
18 * Unless required by applicable law or agreed to in writing, software
19 * distributed under the License is distributed on an "AS IS" BASIS,
20 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21 * See the License for the specific language governing permissions and
22 * limitations under the License.
23 */
24
25
26 function QRCodeDataBlockReader(blocks, version, numErrorCorrectionCode)
27 {
28 this.blockPointer = 0;
29 this.bitPointer = 7;
30 this.dataLength = 0;
31 this.blocks = blocks;
32 this.numErrorCorrectionCode = numErrorCorrectionCode;
33 if (version <= 9)
34 this.dataLengthMode = 0;
35 else if (version >= 10 && version <= 26)
36 this.dataLengthMode = 1;
37 else if (version >= 27 && version <= 40)
38 this.dataLengthMode = 2;
39
40 this.getNextBits = function( numBits)
41 {
42 var bits = 0;
43 if (numBits < this.bitPointer + 1)
44 {
45 // next word fits into current data block
46 var mask = 0;
47 for (var i = 0; i < numBits; i++)
48 {
49 mask += (1 << i);
50 }
51 mask <<= (this.bitPointer - numBits + 1);
52
53 bits = (this.blocks[this.blockPointer] & mask) >> (this.bitPointer - numBits + 1);
54 this.bitPointer -= numBits;
55 return bits;
56 }
57 else if (numBits < this.bitPointer + 1 + 8)
58 {
59 // next word crosses 2 data blocks
60 var mask1 = 0;
61 for (var i = 0; i < this.bitPointer + 1; i++)
62 {
63 mask1 += (1 << i);
64 }
65 bits = (this.blocks[this.blockPointer] & mask1) << (numBits - (this.bitPointer + 1));
66 this.blockPointer++;
67 bits += ((this.blocks[this.blockPointer]) >> (8 - (numBits - (this.bitPointer + 1))));
68
69 this.bitPointer = this.bitPointer - numBits % 8;
70 if (this.bitPointer < 0)
71 {
72 this.bitPointer = 8 + this.bitPointer;
73 }
74 return bits;
75 }
76 else if (numBits < this.bitPointer + 1 + 16)
77 {
78 // next word crosses 3 data blocks
79 var mask1 = 0; // mask of first block
80 var mask3 = 0; // mask of 3rd block
81 //bitPointer + 1 : number of bits of the 1st block
82 //8 : number of the 2nd block (note that use already 8bits because next word uses 3 data blocks)
83 //numBits - (bitPointer + 1 + 8) : number of bits of the 3rd block
84 for (var i = 0; i < this.bitPointer + 1; i++)
85 {
86 mask1 += (1 << i);
87 }
88 var bitsFirstBlock = (this.blocks[this.blockPointer] & mask1) << (numBits - (this.bitPointer + 1));
89 this.blockPointer++;
90
91 var bitsSecondBlock = this.blocks[this.blockPointer] << (numBits - (this.bitPointer + 1 + 8));
92 this.blockPointer++;
93
94 for (var i = 0; i < numBits - (this.bitPointer + 1 + 8); i++)
95 {
96 mask3 += (1 << i);
97 }
98 mask3 <<= 8 - (numBits - (this.bitPointer + 1 + 8));
99 var bitsThirdBlock = (this.blocks[this.blockPointer] & mask3) >> (8 - (numBits - (this.bitPointer + 1 + 8)));
100
101 bits = bitsFirstBlock + bitsSecondBlock + bitsThirdBlock;
102 this.bitPointer = this.bitPointer - (numBits - 8) % 8;
103 if (this.bitPointer < 0)
104 {
105 this.bitPointer = 8 + this.bitPointer;
106 }
107 return bits;
108 }
109 else
110 {
111 return 0;
112 }
113 }
114 this.NextMode=function()
115 {
116 if ((this.blockPointer > this.blocks.length - this.numErrorCorrectionCode - 2))
117 return 0;
118 else
119 return this.getNextBits(4);
120 }
121 this.getDataLength=function( modeIndicator)
122 {
123 var index = 0;
124 while (true)
125 {
126 if ((modeIndicator >> index) == 1)
127 break;
128 index++;
129 }
130
131 return this.getNextBits(qrcode.sizeOfDataLengthInfo[this.dataLengthMode][index]);
132 }
133 this.getRomanAndFigureString=function( dataLength)
134 {
135 var length = dataLength;
136 var intData = 0;
137 var strData = "";
138 var tableRomanAndFigure = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', '$', '%', '*', '+', '-', '.', '/', ':');
139 do
140 {
141 if (length > 1)
142 {
143 intData = this.getNextBits(11);
144 var firstLetter = Math.floor(intData / 45);
145 var secondLetter = intData % 45;
146 strData += tableRomanAndFigure[firstLetter];
147 strData += tableRomanAndFigure[secondLetter];
148 length -= 2;
149 }
150 else if (length == 1)
151 {
152 intData = this.getNextBits(6);
153 strData += tableRomanAndFigure[intData];
154 length -= 1;
155 }
156 }
157 while (length > 0);
158
159 return strData;
160 }
161 this.getFigureString=function( dataLength)
162 {
163 var length = dataLength;
164 var intData = 0;
165 var strData = "";
166 do
167 {
168 if (length >= 3)
169 {
170 intData = this.getNextBits(10);
171 if (intData < 100)
172 strData += "0";
173 if (intData < 10)
174 strData += "0";
175 length -= 3;
176 }
177 else if (length == 2)
178 {
179 intData = this.getNextBits(7);
180 if (intData < 10)
181 strData += "0";
182 length -= 2;
183 }
184 else if (length == 1)
185 {
186 intData = this.getNextBits(4);
187 length -= 1;
188 }
189 strData += intData;
190 }
191 while (length > 0);
192
193 return strData;
194 }
195 this.get8bitByteArray=function( dataLength)
196 {
197 var length = dataLength;
198 var intData = 0;
199 var output = new Array();
200
201 do
202 {
203 intData = this.getNextBits(8);
204 output.push( intData);
205 length--;
206 }
207 while (length > 0);
208 return output;
209 }
210 this.getKanjiString=function( dataLength)
211 {
212 var length = dataLength;
213 var intData = 0;
214 var unicodeString = "";
215 do
216 {
217 intData = getNextBits(13);
218 var lowerByte = intData % 0xC0;
219 var higherByte = intData / 0xC0;
220
221 var tempWord = (higherByte << 8) + lowerByte;
222 var shiftjisWord = 0;
223 if (tempWord + 0x8140 <= 0x9FFC)
224 {
225 // between 8140 - 9FFC on Shift_JIS character set
226 shiftjisWord = tempWord + 0x8140;
227 }
228 else
229 {
230 // between E040 - EBBF on Shift_JIS character set
231 shiftjisWord = tempWord + 0xC140;
232 }
233
234 //var tempByte = new Array(0,0);
235 //tempByte[0] = (sbyte) (shiftjisWord >> 8);
236 //tempByte[1] = (sbyte) (shiftjisWord & 0xFF);
237 //unicodeString += new String(SystemUtils.ToCharArray(SystemUtils.ToByteArray(tempByte)));
238 unicodeString += String.fromCharCode(shiftjisWord);
239 length--;
240 }
241 while (length > 0);
242
243
244 return unicodeString;
245 }
246
247 this.__defineGetter__("DataByte", function()
248 {
249 var output = new Array();
250 var MODE_NUMBER = 1;
251 var MODE_ROMAN_AND_NUMBER = 2;
252 var MODE_8BIT_BYTE = 4;
253 var MODE_KANJI = 8;
254 do
255 {
256 var mode = this.NextMode();
257 //canvas.println("mode: " + mode);
258 if (mode == 0)
259 {
260 if (output.length > 0)
261 break;
262 else
263 throw "Empty data block";
264 }
265 //if (mode != 1 && mode != 2 && mode != 4 && mode != 8)
266 // break;
267 //}
268 if (mode != MODE_NUMBER && mode != MODE_ROMAN_AND_NUMBER && mode != MODE_8BIT_BYTE && mode != MODE_KANJI)
269 {
270 /* canvas.println("Invalid mode: " + mode);
271 mode = guessMode(mode);
272 canvas.println("Guessed mode: " + mode); */
273 throw "Invalid mode: " + mode + " in (block:" + this.blockPointer + " bit:" + this.bitPointer + ")";
274 }
275 dataLength = this.getDataLength(mode);
276 if (dataLength < 1)
277 throw "Invalid data length: " + dataLength;
278 //canvas.println("length: " + dataLength);
279 switch (mode)
280 {
281
282 case MODE_NUMBER:
283 //canvas.println("Mode: Figure");
284 var temp_str = this.getFigureString(dataLength);
285 var ta = new Array(temp_str.length);
286 for(var j=0;j<temp_str.length;j++)
287 ta[j]=temp_str.charCodeAt(j);
288 output.push(ta);
289 break;
290
291 case MODE_ROMAN_AND_NUMBER:
292 //canvas.println("Mode: Roman&Figure");
293 var temp_str = this.getRomanAndFigureString(dataLength);
294 var ta = new Array(temp_str.length);
295 for(var j=0;j<temp_str.length;j++)
296 ta[j]=temp_str.charCodeAt(j);
297 output.push(ta );
298 //output.Write(SystemUtils.ToByteArray(temp_sbyteArray2), 0, temp_sbyteArray2.Length);
299 break;
300
301 case MODE_8BIT_BYTE:
302 //canvas.println("Mode: 8bit Byte");
303 //sbyte[] temp_sbyteArray3;
304 var temp_sbyteArray3 = this.get8bitByteArray(dataLength);
305 output.push(temp_sbyteArray3);
306 //output.Write(SystemUtils.ToByteArray(temp_sbyteArray3), 0, temp_sbyteArray3.Length);
307 break;
308
309 case MODE_KANJI:
310 //canvas.println("Mode: Kanji");
311 //sbyte[] temp_sbyteArray4;
312 //temp_sbyteArray4 = SystemUtils.ToSByteArray(SystemUtils.ToByteArray(getKanjiString(dataLength)));
313 //output.Write(SystemUtils.ToByteArray(temp_sbyteArray4), 0, temp_sbyteArray4.Length);
314 var temp_str = this.getKanjiString(dataLength);
315 output.push(temp_str);
316 break;
317 }
318 //
319 //canvas.println("DataLength: " + dataLength);
320 //Console.out.println(dataString);
321 }
322 while (true);
323 return output;
324 });
325 }