模拟简易二维码的形成
bian二維碼,也叫QR碼,英語是Quick Response Code,于1994年由日本的DENSO WAVE公司發(fā)明。二維碼現(xiàn)在已經(jīng)深入人們生活的方方面面,在網(wǎng)上的二維碼生成器(如草料二維碼)中隨便輸入一段文字或者網(wǎng)址,都可以自動生成一段二維碼。
本博文模擬的簡易二維碼的思路很簡單,即:字符轉(zhuǎn)二值化圖像,先將一個字符轉(zhuǎn)為整數(shù),然后將整數(shù)轉(zhuǎn)為二進制數(shù),再根據(jù)二進制數(shù)0繪制一個白塊 1繪制一個黑塊 就實現(xiàn)了一個簡易的二維碼
這個字符轉(zhuǎn)二進制數(shù)的函數(shù)運行結果:
?
為什么轉(zhuǎn)出來的二進制數(shù)只有7bit 而不是16bit
-編碼當中有ASCII 128個 2^7? byte的整數(shù)部分 0-127
因為這個字符都在ASCII中 ,最多只有7bit,所以這里有數(shù)據(jù)不統(tǒng)一的問題 ?還涉及到中文轉(zhuǎn)碼的長度問題。將不規(guī)則的字符串二進制碼 ?補全8bit? 在前面補0,存儲轉(zhuǎn)好的二進制碼。
再就是漢字編碼問題,在實際遇到的場景中,很多情況都需要用到中英文混合編碼。
-ASCII 編碼 :英文字母 數(shù)字 大小寫 符號 控制符
?- 都只需要一個字節(jié)就能表達內(nèi)容
而漢字有3w多個,java中的char占兩字節(jié)16bit兩個字節(jié),能表示的數(shù)量:65536,故漢字可以用char類型來表達,這里涉及到字符編碼范式 :utf-8?? GBK ……
中英文混合編碼的思路:
因為漢字是兩個字節(jié)存儲,所以先有總的思路,開頭為1的為漢字,開頭為0的為英文。
兩種思路:
1.讀取到一個字節(jié)的二進制碼是0開始的,就看作是一個ASCII碼 ?只讀一個字節(jié)為一個字符,漢字用三個字節(jié)進行編碼,在所有漢字二進制碼前再加一個1開頭的字節(jié)如10000000.這樣還可以擴展,將一些不屬于漢字的表情包加入編碼。
2.英文漢字全部用兩個字節(jié),漢字開頭加1,英文多加一個00000000.
這里采用第一種思路的代碼以及生成的簡易二維碼圖像:
package cs0323;import cs0317.QRcode;import javax.swing.*; import java.awt.*;public class QRcodeUI extends JFrame {String [] binaryStrArray = {};public static void main(String[] args) {cs0323.QRcodeUI qrui = new cs0323.QRcodeUI();qrui.setTitle("二維碼顯示");qrui.setVisible(true);qrui.setSize(800,800);qrui.setDefaultCloseOperation(EXIT_ON_CLOSE);}@Overridepublic void paint(Graphics g){super.paint(g);QRCode qr = new QRCode();binaryStrArray = qr.stringToBinaryString();for(int i = 0 ; i < binaryStrArray.length ; i++){String str = binaryStrArray[i];for(int j = 0 ; j < str.length(); j++){char c = str.charAt(j);if(c == '0'){g.setColor(Color.WHITE);}else{g.setColor(Color.BLACK);}g.fillRect(50+i*30,100+j*30,30,30);}}}} package cs0323;public class QRCode{public String[] stringToBinaryString(){String str ="abcd今天天氣不錯";String[] binaryStrArray = new String[str.length ()];// 取出單個的字符for(int i = 0; i < str.length (); i++){char c = str.charAt (i);String binaryStr = Integer.toBinaryString (c);// 將不規(guī)則的字符串二進制碼// 補碼 補全 8bit 在前面補0while(binaryStr.length ()<8){binaryStr=0+binaryStr;}while(binaryStr.length()>8 && binaryStr.length()<16){binaryStr=0+binaryStr;}if(binaryStr.length() == 16){binaryStr=10000000+binaryStr;}System.out.println (binaryStr);// 存儲轉(zhuǎn)好的二進制碼binaryStrArray[i]=binaryStr;}return binaryStrArray;} }“abcd今天天氣不錯”編碼結果:
?運行結果:
?這里沒有對圖像進行其它的規(guī)范化操作。
總結
以上是生活随笔為你收集整理的模拟简易二维码的形成的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二维码名片制作:MECARD 和 vCa
- 下一篇: 经典的囚徒困境