目录
文本信息转化
上篇文章我们已经讲到,在计算机中有一些信息交换代码,也可以理解为一种协议,常见的就是ASCII码和Unicode协议,而在计算机底层中,存储的只有二进制信息,一切形式的信息都会转化为二进制信息,今天的代码我们的任务就是将一段字符信息存入二维码中。
代码实现
步骤
1.创建界面
首先创建要能呈现出二维码的界面,同时,创建一个数组:String[] codeArr;用来存储字符信息,便于后面直接使用数组来绘制二维码。
class CodeUI01 extends JFrame {
String[] codeArr;
CodeUI01(String[] codeArr){
this.codeArr=codeArr;
this.setSize(600,600);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
2.字符串信息存入数组中
选择在主函数中将字符串信息存入数组,便于后面绘制。这里我们提前选择补满9位二进制位,将二进制数字前面补0的目的是确保每个二进制码都具有相同的位数,方便后续在图形界面中以矩形的形式展示。
使用Interger.toBinaryString(d)方法将字符转换为对应的二进制码。但是,这个方法返回的是不含前导零的二进制字符串。为了保证每个二进制码都具有相同的位数,需要将长度不足8位的二进制码进行补零操作。
通过在二进制码的前面添加0,可以保证每个二进制码都具有相同的长度,从而在图形界面中以矩形的形式进行展示时,每个矩形的大小都是一样的。这样可以确保整个二维矩阵的形状正确,不会出现因为二进制码长度不一致而导致矩形显示错位或大小不一致的问题。
public static void main(String[] args){
String str="/javascript/ /mysql/ /python//code/";
String[] codeArr=new String[str.length()];
//把每个字符取出
for(int i=0;i<str.length();i++){
char d=str.charAt(i);
System.out.print(d+"-"+(int)d);
//用integer.toBingaryString()把对应的数字转换成二进制码
String binStr=Integer.toBinaryString(d);
System.out.print(" "+binStr);
//把每个二进制串,补上八位,前面补0
while(binStr.length()<=8){
binStr='0'+binStr;
}
System.out.println(" "+binStr);
//存储这些数据
codeArr[i]=binStr;
}
new CodeUI01(codeArr);
}
3.绘制二维码
JFrame类是javax.swing.JFrame的父类,它提供了一些基本的功能和方法用于创建和管理图形界面窗口。其中就包括了paint方法。在JFrame类中,paint方法是一个用于绘制组件的图形表示的方法。当需要在窗口上进行绘图时,可以重写paint方法,在方法中编写绘图的逻辑。重写paint方法后,可以通过调用super.paint(g)来执行父类的绘图逻辑,然后再添加自定义的绘图逻辑。
在这段代码中,通过继承JFrame类,并重写paint方法,在CodeUI01类中实现了自定义的绘图逻辑,用于将二进制码以矩形的形式绘制在窗口上。
在paint方法中,通过循环遍历codeArr数组中的二进制码。对于每个二进制码,将其转换为字符数组chars,以便逐个检查每个二进制位的值。对于每个二进制位,如果它的值是0,则将当前绘图环境的颜色设置为白色(Color.WHITE),否则设置为黑色(Color.BLACK)。
使用Graphics对象的fillRect方法绘制一个矩形,矩形的位置和大小由计算得出:横坐标为100 + i * 10,纵坐标为100 + j * 10,宽度为高度为10每个字符的信息纵向。这就是每个模块的代码实现,完整代码我放在文章最后。
@Override
public void paint(Graphics g){
super.paint(g);
for(int i=0;i<codeArr.length;i++){
char[] chars=codeArr[i].toCharArray();
for(int j=0;j<chars.length;j++){
if(chars[j]=='0'){
g.setColor(Color.WHITE);
} else{
g.setColor(Color.BLACK);
}
g.fillRect(100+i*10,100+j*10,10,10);
}
}
g.setColor(Color.BLUE);
g.drawRect(99,99,codeArr.length*10+2,codeArr[0].length()*10+2);
}
完整代码
import javax.swing.*;
import java.awt.*;
public class Code {
public static void main(String[] args){
String str="/javascript/ /mysql//code/";
String[] codeArr=new String[str.length()];
//把每个字符取出
for(int i=0;i<str.length();i++){
char d=str.charAt(i);
System.out.print(d+"-"+(int)d);
//用integer.toBingaryString()把对应的数字转换成二进制码
String binStr=Integer.toBinaryString(d);
System.out.print(" "+binStr);
//把每个二进制串,补上八位,前面补0
while(binStr.length()<=8){
binStr='0'+binStr;
}
System.out.println(" "+binStr);
//存储这些数据
codeArr[i]=binStr;
}
new CodeUI01(codeArr);
}
}
class CodeUI01 extends JFrame {
String[] codeArr;
CodeUI01(String[] codeArr){
this.codeArr=codeArr;
this.setSize(600,600);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
@Override
public void paint(Graphics g){
super.paint(g);
for(int i=0;i<codeArr.length;i++){
char[] chars=codeArr[i].toCharArray();
for(int j=0;j<chars.length;j++){
if(chars[j]=='0'){
g.setColor(Color.WHITE);
} else{
g.setColor(Color.BLACK);
}
g.fillRect(100+i*10,100+j*10,10,10);
}
}
g.setColor(Color.BLUE);
g.drawRect(99,99,codeArr.length*10+2,codeArr[0].length()*10+2);
}
}
总结
这段代码是一个简单的Java程序,用于将给定的字符串信息转换为二维码的图形表示并展示在图形界面上。它通过将字符串信息转换为二进制码,并将每个二进制码补足为8位的形式存储在数组中。
然后,利用JFrame和Graphics类实现了一个简单的图形界面,使用矩形来表示二进制码的0和1,并根据二进制位的值设置矩形的颜色。通过重写paint方法,在窗口上绘制二维码的矩形表示,并添加外边框以突出显示二维码。这段代码通过将文本信息转换为可视化的二维矩阵形式,展示了简单的二维码生成和图形界面绘图的原理。