模拟简易二维码的形成
bian二維碼,也叫QR碼,英語是Quick Response Code,于1994年由日本的DENSO WAVE公司發明。二維碼現在已經深入人們生活的方方面面,在網上的二維碼生成器(如草料二維碼)中隨便輸入一段文字或者網址,都可以自動生成一段二維碼。
本博文模擬的簡易二維碼的思路很簡單,即:字符轉二值化圖像,先將一個字符轉為整數,然后將整數轉為二進制數,再根據二進制數0繪制一個白塊 1繪制一個黑塊 就實現了一個簡易的二維碼
這個字符轉二進制數的函數運行結果:
?
為什么轉出來的二進制數只有7bit 而不是16bit
-編碼當中有ASCII 128個 2^7? byte的整數部分 0-127
因為這個字符都在ASCII中 ,最多只有7bit,所以這里有數據不統一的問題 ?還涉及到中文轉碼的長度問題。將不規則的字符串二進制碼 ?補全8bit? 在前面補0,存儲轉好的二進制碼。
再就是漢字編碼問題,在實際遇到的場景中,很多情況都需要用到中英文混合編碼。
-ASCII 編碼 :英文字母 數字 大小寫 符號 控制符
?- 都只需要一個字節就能表達內容
而漢字有3w多個,java中的char占兩字節16bit兩個字節,能表示的數量:65536,故漢字可以用char類型來表達,這里涉及到字符編碼范式 :utf-8?? GBK ……
中英文混合編碼的思路:
因為漢字是兩個字節存儲,所以先有總的思路,開頭為1的為漢字,開頭為0的為英文。
兩種思路:
1.讀取到一個字節的二進制碼是0開始的,就看作是一個ASCII碼 ?只讀一個字節為一個字符,漢字用三個字節進行編碼,在所有漢字二進制碼前再加一個1開頭的字節如10000000.這樣還可以擴展,將一些不屬于漢字的表情包加入編碼。
2.英文漢字全部用兩個字節,漢字開頭加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);// 將不規則的字符串二進制碼// 補碼 補全 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);// 存儲轉好的二進制碼binaryStrArray[i]=binaryStr;}return binaryStrArray;} }“abcd今天天氣不錯”編碼結果:
?運行結果:
?這里沒有對圖像進行其它的規范化操作。
總結
以上是生活随笔為你收集整理的模拟简易二维码的形成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二维码名片制作:MECARD 和 vCa
- 下一篇: 经典的囚徒困境