先附上要求
请设计一款存储空间为8个字节的二维码,用于为自己设计的APP进行扫码支付; 要求: 1)绘制此二维码的至少2个例子,并截图(截图1.1); 2)详细讲述每一个字节、每一位的编码原理、含义; 3)详细讲述采用此二维码的优势,可从用户使用方便程度、开发人员的程序设计方便程度、辨识难易程度等方面着手。
实现
- 两个例子
2.简单的逻辑是,按照long的二进制形式的01表达,0代表白块,1代表黑块。 实现细节: 因为要8字节存储的二维码,而在java中,long型变量占据8字节,所以我的想法是二维码实例使用long型变量存储,再将long型变量解析为二进制,进行绘制二维码。 而8字节则拥有64bit,每个bit要么是0要么是1。所以我通过生成随机数的方式来生成这个二进制码。 为什么不通过生成十进制的long呢,因为经过实验,想刚好生成long范围的随机数,极易造成溢出,所以我放弃了这一写法。 至于为什么使用StringBuffer而不使用String,那是因为String是不可变的,至于StringBuffer与StringBuilder的选择,这里无所谓,毕竟我的项目作业不是多线程的。 不过,StringBuilder有速度优势,但是不是线程安全的。 这样我就得到了long型变量的二进制形式。 这里我将StringBuffer改成了String 这其实是没啥必要的,只是简单的因为我对于String的运用熟练度更高。 我们知道,在二进制表达中,首位0表示是正数,1表示是负数。 这里的d,就是用来判断数据的正负的,因为我再最后,将StringBuffer存储的二进制码的首位,无论如何,直接改成0. 为什么我要这么做呢? 因为Long.parseUnsignedLong方法,是无符号运算,所以我必须把最前面的1单独提出。 最后,我得到了long型变量f,用于存储我生成的二维码。 接下来就是绘图了。 为了看起来更像一个二维码,我提供了50*50的JPanel。 通过不断的64周期来创建黑白块,即形成了我上述的二维码样式。 3. ①程序设计方便程度:极度方便,通过随机数来生成,根据用户流量,可以更改为多线程模式,也可以在以后客流量更大后,通过时间戳来生成,扩大存储空间,生成更加复杂的二维码。 ②辨识难度:因为是周期性重复,所以其实仅仅需要某一段就可以辨识,大大提高辨识效率。 ③用户使用:随机数,后端内存占用小,生成的快,用户使用更舒畅,不用全部展现,只需要某一段出现即可,大大提高用户的使用体验感。
Ps:附上源码,不过,图片调用路径需要更改,以及图片需要自己存储。
import java.util.Scanner;
public class jugde {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
long x = scan.nextLong();
boolean flag = true;
if(x<1){
System.out.println("输入错误");
return;
}
if(x>=10000000000L){
System.out.println("超过计算范围,输入不正确");
return;
}
if(x==1){
flag = false;
}
for(int i = 2;i<x;i++){
if(x%i==0){
flag = false;
break;
}
}
if(flag){
System.out.println("是");
}else{
System.out.println("不是");
}
}
}
|