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);
}
@Override
public 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 在前面补0
while(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今天天气不错”编码结果:
运行结果:
这里没有对图像进行其它的规范化操作。