📄 qrcode.java
字号:
package com.swetake.util;import java.io.*;/** * * QRcode class library 0.50beta10<BR> * (c)2003-2005 Y.Swetake<BR> * This version supports QRcode model2 version 1-40.<BR> * Some functions are not supported.<BR> *<BR> * @author Y.Swetake * @version 0.50beta10 * * */public class Qrcode{static final String QRCODE_DATA_PATH="qrcode_data";char qrcodeErrorCorrect;char qrcodeEncodeMode;int qrcodeVersion;int qrcodeStructureappendN;int qrcodeStructureappendM;int qrcodeStructureappendParity;String qrcodeStructureappendOriginaldata;public Qrcode(){ qrcodeErrorCorrect='M'; qrcodeEncodeMode='B'; qrcodeVersion=0; qrcodeStructureappendN=0; qrcodeStructureappendM=0; qrcodeStructureappendParity=0; qrcodeStructureappendOriginaldata="";} /** *エラ〖柠赖レベルを肋年します。 *@param ecc-エラ〖柠赖レベル('L','M','Q','H') * */public void setQrcodeErrorCorrect(char ecc){ qrcodeErrorCorrect=ecc;} /** *附哼肋年されているエラ〖柠赖レベルを艰评します。 *@return エラ〖柠赖レベル('L','M','Q','H') * */public char getQrcodeErrorCorrect(){ return qrcodeErrorCorrect;} /** *附哼肋年されているバ〖ジョンを艰评します。 *@return バ〖ジョン 0から40の腊眶。0の眷圭は极瓢肋年。 * */public int getQrcodeVersion(){ return qrcodeVersion;} /** *バ〖ジョンを肋年します。 *0を肋年すると极瓢肋年になります。 *@param version 0から40の腊眶 * */public void setQrcodeVersion(int ver){ if (ver>=0 && ver<=40){ qrcodeVersion=ver; }} /** *エンコ〖ドモ〖ドを肋年します。 *'N':眶机モ〖ド 'A':毖眶机モ〖ド その戮:8bit byteモ〖ド *@param encMode エンコ〖ドモ〖ド('N','A' or other) * */public void setQrcodeEncodeMode(char encMode){ qrcodeEncodeMode=encMode;} /** *附哼肋年されているエンコ〖ドモ〖ドを艰评します。 *@return エンコ〖ドモ〖ド ('N','A' or other) * */public char getQrcodeEncodeMode(){ return qrcodeEncodeMode;} /** *息冯簇息のメソッドです。 *(活赋瞥掐です。) * */public void setStructureappend(int m,int n,int p){ if (n>1 && n<=16 && m>0 && m<=16 && p>=0 && p<=255){ qrcodeStructureappendM=m; qrcodeStructureappendN=n; qrcodeStructureappendParity=p; }} /** *息冯に脱いるパリティを换叫します。 *(活赋瞥掐です。) */public int calStructureappendParity(byte[] originaldata){ int originaldataLength; int i=0; int structureappendParity=0; originaldataLength=originaldata.length; if (originaldataLength>1){ structureappendParity=0; while (i<originaldataLength){ structureappendParity=(structureappendParity ^ (originaldata[i] & 0xFF)); i++; } } else { structureappendParity=-1; } return structureappendParity;} /** *涂えられたデ〖タ误からQRコ〖ドエンコ〖ドデ〖タを *boolean企肌傅芹误で手します。 *@param data エンコ〖ドするデ〖タ *@return QRコ〖ドエンコ〖ドデ〖タ */public boolean[][] calQrcode(byte[] qrcodeData){ int dataLength; int dataCounter=0; dataLength=qrcodeData.length; int[] dataValue=new int[dataLength+32]; byte[] dataBits=new byte[dataLength+32]; if (dataLength<=0) { boolean ret[][]={{false}}; return ret; } if (qrcodeStructureappendN>1){ dataValue[0]=3; dataBits[0]=4; dataValue[1]=qrcodeStructureappendM-1; dataBits[1]=4; dataValue[2]=qrcodeStructureappendN-1; dataBits[2]=4; dataValue[3]=qrcodeStructureappendParity; dataBits[3]=8; dataCounter=4; } dataBits[dataCounter]=4; /* --- determine encode mode --- */ int[] codewordNumPlus; int codewordNumCounterValue; switch (qrcodeEncodeMode){ /* ---- alphanumeric mode --- */ case 'A': codewordNumPlus=new int[]{0,0,0,0,0,0,0,0,0,0, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 4,4,4,4,4,4,4,4,4,4,4,4,4,4}; dataValue[dataCounter]=2; dataCounter++; dataValue[dataCounter]=dataLength; dataBits[dataCounter]=9; codewordNumCounterValue=dataCounter; dataCounter++; for (int i=0;i<dataLength;i++){ char chr=(char)qrcodeData[i]; byte chrValue=0; if (chr>=48 && chr<58) { chrValue=(byte)(chr-48); } else { if (chr>=65 && chr<91){ chrValue=(byte)(chr-55); } else { if (chr==32){chrValue=36;} if (chr==36){chrValue=37;} if (chr==37){chrValue=38;} if (chr==42){chrValue=39;} if (chr==43){chrValue=40;} if (chr==45){chrValue=41;} if (chr==46){chrValue=42;} if (chr==47){chrValue=43;} if (chr==58){chrValue=44;} } } if ((i % 2)==0){ dataValue[dataCounter]=chrValue; dataBits[dataCounter]=6; } else { dataValue[dataCounter]=dataValue[dataCounter]*45+chrValue; dataBits[dataCounter]=11; if (i<dataLength-1){ dataCounter++; } } } dataCounter++; break; /* ---- numeric mode ---- */ case 'N': codewordNumPlus=new int[]{0,0,0,0,0,0,0,0,0,0, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 4,4,4,4,4,4,4,4,4,4,4,4,4,4}; dataValue[dataCounter]=1; dataCounter++; dataValue[dataCounter]=dataLength; dataBits[dataCounter]=10; /* #version 1-9*/ codewordNumCounterValue=dataCounter; dataCounter++; for (int i=0; i<dataLength; i++){ if ((i % 3)==0){ dataValue[dataCounter]=(int)(qrcodeData[i]-0x30); dataBits[dataCounter]=4; } else { dataValue[dataCounter]=dataValue[dataCounter]*10+(int)(qrcodeData[i]-0x30); if ((i % 3)==1){ dataBits[dataCounter]=7; } else { dataBits[dataCounter]=10; if (i<dataLength-1){ dataCounter++; } } } } dataCounter++; break; /* ---- 8bit byte ---- */ default: codewordNumPlus=new int[]{0,0,0,0,0,0,0,0,0,0, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8}; dataValue[dataCounter]=4; dataCounter++; dataValue[dataCounter]=dataLength; dataBits[dataCounter]=8; /* #version 1-9 */ codewordNumCounterValue=dataCounter; dataCounter++; for (int i=0 ;i<dataLength;i++){ dataValue[i+dataCounter]=(qrcodeData[i] & 0xFF); dataBits[i+dataCounter]=8; } dataCounter+=dataLength; break; } int totalDataBits=0; for (int i=0;i<dataCounter;i++){ totalDataBits+=dataBits[i]; } int ec; switch (qrcodeErrorCorrect){ case 'L': ec=1; break; case 'Q': ec=3; break; case 'H': ec=2; break; default: ec=0; } int[][] maxDataBitsArray={{0,128,224,352,512,688,864,992,1232,1456,1728,2032,2320,2672,2920,3320,3624,4056,4504,5016,5352,5712,6256,6880,7312,8000,8496,9024,9544,10136,10984,11640,12328,13048,13800,14496,15312,15936,16816,17728,18672},{0,152,272,440,640,864,1088,1248,1552,1856,2192,2592,2960,3424,3688,4184,4712,5176,5768,6360,6888,7456,8048,8752,9392,10208,10960,11744,12248,13048,13880,14744,15640,16568,17528,18448,19472,20528,21616,22496,23648},{0,72,128,208,288,368,480,528,688,800,976,1120,1264,1440,1576,1784,2024,2264,2504,2728,3080,3248,3536,3712,4112,4304,4768,5024,5288,5608,5960,6344,6760,7208,7688,7888,8432,8768,9136,9776,10208},{0,104,176,272,384,496,608,704,880,1056,1232,1440,1648,1952,2088,2360,2600,2936,3176,3560,3880,4096,4544,4912,5312,5744,6032,6464,6968,7288,7880,8264,8920,9368,9848,10288,10832,11408,12016,12656,13328}}; int maxDataBits=0; if (qrcodeVersion==0){ /* auto version select */ qrcodeVersion=1; for (int i=1;i<=40;i++){ if ((maxDataBitsArray[ec][i])>=totalDataBits+codewordNumPlus[qrcodeVersion]){ maxDataBits=maxDataBitsArray[ec][i]; break; } qrcodeVersion++; } } else { maxDataBits=maxDataBitsArray[ec][qrcodeVersion]; } totalDataBits+=codewordNumPlus[qrcodeVersion]; dataBits[codewordNumCounterValue]+=codewordNumPlus[qrcodeVersion]; int[] maxCodewordsArray={0,26,44,70,100,134,172,196,242, 292,346,404,466,532,581,655,733,815,901,991,1085,1156, 1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465, 2611,2761,2876,3034,3196,3362,3532,3706}; int maxCodewords=maxCodewordsArray[qrcodeVersion]; int maxModules1side=17+(qrcodeVersion <<2); int[] matrixRemainBit={0,0,7,7,7,7,7,0,0,0,0,0,0,0,3,3,3,3,3,3,3, 4,4,4,4,4,4,4,3,3,3,3,3,3,3,0,0,0,0,0,0};/* ---- read version ECC data file */ int byte_num=matrixRemainBit[qrcodeVersion]+(maxCodewords << 3); byte[] matrixX = new byte[byte_num]; byte[] matrixY = new byte[byte_num]; byte[] maskArray = new byte[byte_num]; byte[] formatInformationX2 =new byte[15]; byte[] formatInformationY2 =new byte[15]; byte[] rsEccCodewords = new byte[1]; byte[] rsBlockOrderTemp=new byte[128]; try { String filename=QRCODE_DATA_PATH+"/qrv"+Integer.toString(qrcodeVersion)+"_"+Integer.toString(ec)+".dat"; InputStream fis =Qrcode.class.getResourceAsStream(filename); BufferedInputStream bis = new BufferedInputStream(fis); bis.read(matrixX); bis.read(matrixY); bis.read(maskArray); bis.read(formatInformationX2); bis.read(formatInformationY2); bis.read(rsEccCodewords); bis.read(rsBlockOrderTemp); bis.close(); fis.close(); } catch(Exception e) { e.printStackTrace(); } byte rsBlockOrderLength=1; for (byte i=1;i<128;i++){ if (rsBlockOrderTemp[i]==0){ rsBlockOrderLength=i; break; } } byte[] rsBlockOrder = new byte[rsBlockOrderLength]; System.arraycopy(rsBlockOrderTemp,0,rsBlockOrder,0,rsBlockOrderLength); byte[] formatInformationX1 ={0,1,2,3,4,5,7,8,8,8,8,8,8,8,8}; byte[] formatInformationY1 ={8,8,8,8,8,8,8,8,7,5,4,3,2,1,0}; int maxDataCodewords=maxDataBits >> 3; /* -- read frame data -- */ int modules1Side = 4*qrcodeVersion+17; int matrixTotalBits = modules1Side * modules1Side; byte[] frameData = new byte[matrixTotalBits+modules1Side];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -