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 }