模拟简易二维码的形成

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今天天气不错”编码结果:

 运行结果:

 这里没有对图像进行其它的规范化操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值