⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qrcode.java

📁 java源码 在线生成二维条码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -