Runable jar file
地址:http://pan.baidu.com/s/1hqefLLa ; 遇到bug 予以告诉 谢谢
//窗体类
package cn.lovly.base64;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Choice;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class BaseFrame extends Frame{
public static void main(String[] args) {
new BaseFrame();
}
private Label label=null;
private TextArea ta=null,ta1=null;
private Button btkey=null,btNoKey=null;
private Choice ColorChooser=null;
public BaseFrame(){
this.setBounds(600, 150, 300, 280);
this.setVisible(true);
//给窗体添加关闭事件
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent arg0) {
System.exit(0);
}
});
this.setResizable(false);//不可以改变窗体的大小
Panel p=new Panel();
label=new Label("请输入加密或解密的字符串");
/*下拉列表*/
ColorChooser = new Choice();
ColorChooser.add("GBK");
ColorChooser.add("UTF-8");
/*文本域*/
Panel p1=new Panel();
ta= new TextArea("请输入加密或解密的字符串", 5, 30);
ta1= new TextArea("", 5, 30);
/*按钮*/
Panel p2=new Panel();
btkey=new Button("加密");
btNoKey=new Button("解密");
/*绑定控件 */
p.add(label);
p.add(ColorChooser);
p1.add(ta);
p1.add(ta1);
p2.add(btkey);
p2.add(btNoKey);
this.add(p,BorderLayout.NORTH);
this.add(p1,BorderLayout.CENTER);
this.add(p2,BorderLayout.SOUTH);
ta.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if(ta.getText().equals("请输入加密或解密的字符串"))
ta.setText("");
}
});
btkey.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
String strKey=ta.getText();
String encoding=ColorChooser.getSelectedItem();
String outKey=Base64_Demo.encoding(strKey, encoding);
ta1.setText(outKey);
}
});
btNoKey.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
String strKey=ta.getText();
String encoding=ColorChooser.getSelectedItem();
String outNoKey=Base64_Demo.decoding(strKey, encoding);
ta1.setText(outNoKey);
}
});
}
}
// base64类 main方法没有可以去掉
package cn.lovly.base64;
import java.io.UnsupportedEncodingException;
import java.util.Scanner;
public class Base64_Demo {
public static void main(String[] args) {
while(true){
System.out.println("请输选择:1 加密 2 解密 3 退出 ");
Scanner input=new Scanner(System.in);
int isKey=input.nextInt();
switch (isKey) {
case 1:
System.out.println("请输入需要加密的字符串");
String strKey=input.next();
System.out.println("请输入采用加密的编码 例如 GBK 或者UTF-8");
String encoding=input.next();
System.out.println("加密后的字符串是:["+Base64_Demo.encoding(strKey, encoding)+"]");
break;
case 2:
System.out.println("请输入加密后的字符串");
String str=input.next();
System.out.println("请输入采用解密的编码 例如 GBK 或者UTF-8");
String encoder=input.next();
System.out.println("解密后的字符串是:["+Base64_Demo.decoding(str, encoder)+"]");
break;
default:
System.exit(0);
break;
}
}
}
private static String base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
/*******************************************加密**********************************************/
public static String encoding(String str,String encoding){
byte bt[]=null;
try {
bt=str.getBytes(encoding);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(encoding+"编码错误",e); //捕获异常
} //根据 调用者传过来编码 进行编码 产生 byte[]数组 汉字GBK 占两个字节 UTF-8编码 汉字占三个字节..... 编码不一样产生的 字节不一样 最后的base64编码也不一样
int count=bt.length/3; //base64 算法是 3个字节转成4个字节 求余运算 能够分成多个3个字节的整数
int index=bt.length%3;// 求模运算
StringBuffer sb=new StringBuffer();
if(count > 0){ //每三个字节 进行一次 base64编码运算
for (int i = 0; i < bt.length-index; i+=3) {
sb.append(base64.charAt(((bt[i]&0xff) >> 2))); // oxff&bt[i] bt[i]转成整形 也就是4个字节 与0xff 运算 清除高位16个bits 为0
sb.append(base64.charAt((((bt[i]&0xff) << 4)|((bt[i+1]&0xff)>>4))&0x3f));
sb.append(base64.charAt((((bt[i+1]&0xff) << 2)|((bt[i+2]&0xff) >> 6))&0x3f));
sb.append(base64.charAt((bt[i+2]&0xff)&0x3f));
}
add(sb, bt, index);
}else{
add(sb, bt, index);
}
return sb.toString();
}
public static void add(StringBuffer sb,byte [] bt,int index){
if(index > 0){
if(index == 1){// 1 个字节 假设 1100 1010
sb.append(base64.charAt((bt[bt.length-1]&0xff) >> 2));
sb.append(base64.charAt(((bt[bt.length-1]&0xff) << 4) &0x3f));
sb.append("=="); // 补一对00 加一个=
}
if(index == 2){//两个字节
sb.append(base64.charAt((bt[bt.length-2]&0xff) >> 2));
sb.append(base64.charAt((((bt[bt.length-2]&0xff) << 4)|((bt[bt.length-1]&0xff)>>4))&0x3f));
sb.append(base64.charAt(((bt[bt.length-1]&0xff) << 2) &0x3f));
sb.append("=");
}
}
}
/*******************************解密*******************************/
//代码中的base64_decode_map的作用就是将base64索引中的ASCII字符转换成原始的0-63的数字。
/* tatic int base64_decode_map[256] = {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0 - 15
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 16 - 31
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, // 32 - 47
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, // 48 - 63
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, // 64 - 79
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, // 80 - 95
-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 96 - 111
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, // 112 - 127
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 128 - 143
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 144 - 159
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 160 - 175
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 176 - 191
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 192 - 207
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 208 - 223
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 224 - 239
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 240 - 255
}; */
private static byte [] base64_decode_map=new byte[256];
static{
for (int i = 0; i < 256; i++) {
base64_decode_map[i]=-1;
}
for (int i = 'A'; i <= 'Z'; i++) {
base64_decode_map[i]=(byte) (i-'A');
}
for (int i = 'a'; i <= 'z'; i++) {
base64_decode_map[i]=(byte) (26+i-'a');
}
for (int i = '0'; i <= '9'; i++) {
base64_decode_map[i]=(byte) (52+i-'0');
}
base64_decode_map['+']=62;
base64_decode_map['/']=63;
}
public static String decoding(String str,String encoding){
char []data=str.toCharArray();
int len=((data.length+3)/4)*3;
if((data.length > 0)&& (data[data.length-1] == '='))
--len;
if((data.length > 1)&& (data[data.length-2] == '='))
--len;
byte[] out=new byte[len];
int index=0;
int shift=0;
int accum=0;
for (int i = 0; i < data.length; i++) {
int value=base64_decode_map[data[i] & 0xff];// data[i]个人感觉 在 和1111 1111进行与运算时 会转成ASCII码里对应的位置 例如 1 会转成49
if(value > 0)
{
accum <<= 6;
shift+=6;
accum|=value;
if(shift >= 8)
{
shift-=8;
out[index++]=(byte) ((accum >> shift) & 0xff);
}
}
}
if (index != out.length)
throw new Error("miscalculated data length!");
String outStr=null;
try {
outStr=new String(out,0,out.length,encoding);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("创建String错误",e);
}
return outStr;
}
}
可以打成 run的jar包 需要jdk的支持
//窗体类
package cn.lovly.base64;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Choice;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class BaseFrame extends Frame{
public static void main(String[] args) {
new BaseFrame();
}
private Label label=null;
private TextArea ta=null,ta1=null;
private Button btkey=null,btNoKey=null;
private Choice ColorChooser=null;
public BaseFrame(){
this.setBounds(600, 150, 300, 280);
this.setVisible(true);
//给窗体添加关闭事件
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent arg0) {
System.exit(0);
}
});
this.setResizable(false);//不可以改变窗体的大小
Panel p=new Panel();
label=new Label("请输入加密或解密的字符串");
/*下拉列表*/
ColorChooser = new Choice();
ColorChooser.add("GBK");
ColorChooser.add("UTF-8");
/*文本域*/
Panel p1=new Panel();
ta= new TextArea("请输入加密或解密的字符串", 5, 30);
ta1= new TextArea("", 5, 30);
/*按钮*/
Panel p2=new Panel();
btkey=new Button("加密");
btNoKey=new Button("解密");
/*绑定控件 */
p.add(label);
p.add(ColorChooser);
p1.add(ta);
p1.add(ta1);
p2.add(btkey);
p2.add(btNoKey);
this.add(p,BorderLayout.NORTH);
this.add(p1,BorderLayout.CENTER);
this.add(p2,BorderLayout.SOUTH);
ta.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if(ta.getText().equals("请输入加密或解密的字符串"))
ta.setText("");
}
});
btkey.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
String strKey=ta.getText();
String encoding=ColorChooser.getSelectedItem();
String outKey=Base64_Demo.encoding(strKey, encoding);
ta1.setText(outKey);
}
});
btNoKey.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
String strKey=ta.getText();
String encoding=ColorChooser.getSelectedItem();
String outNoKey=Base64_Demo.decoding(strKey, encoding);
ta1.setText(outNoKey);
}
});
}
}
// base64类 main方法没有可以去掉
package cn.lovly.base64;
import java.io.UnsupportedEncodingException;
import java.util.Scanner;
public class Base64_Demo {
public static void main(String[] args) {
while(true){
System.out.println("请输选择:1 加密 2 解密 3 退出 ");
Scanner input=new Scanner(System.in);
int isKey=input.nextInt();
switch (isKey) {
case 1:
System.out.println("请输入需要加密的字符串");
String strKey=input.next();
System.out.println("请输入采用加密的编码 例如 GBK 或者UTF-8");
String encoding=input.next();
System.out.println("加密后的字符串是:["+Base64_Demo.encoding(strKey, encoding)+"]");
break;
case 2:
System.out.println("请输入加密后的字符串");
String str=input.next();
System.out.println("请输入采用解密的编码 例如 GBK 或者UTF-8");
String encoder=input.next();
System.out.println("解密后的字符串是:["+Base64_Demo.decoding(str, encoder)+"]");
break;
default:
System.exit(0);
break;
}
}
}
private static String base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
/*******************************************加密**********************************************/
public static String encoding(String str,String encoding){
byte bt[]=null;
try {
bt=str.getBytes(encoding);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(encoding+"编码错误",e); //捕获异常
} //根据 调用者传过来编码 进行编码 产生 byte[]数组 汉字GBK 占两个字节 UTF-8编码 汉字占三个字节..... 编码不一样产生的 字节不一样 最后的base64编码也不一样
int count=bt.length/3; //base64 算法是 3个字节转成4个字节 求余运算 能够分成多个3个字节的整数
int index=bt.length%3;// 求模运算
StringBuffer sb=new StringBuffer();
if(count > 0){ //每三个字节 进行一次 base64编码运算
for (int i = 0; i < bt.length-index; i+=3) {
sb.append(base64.charAt(((bt[i]&0xff) >> 2))); // oxff&bt[i] bt[i]转成整形 也就是4个字节 与0xff 运算 清除高位16个bits 为0
sb.append(base64.charAt((((bt[i]&0xff) << 4)|((bt[i+1]&0xff)>>4))&0x3f));
sb.append(base64.charAt((((bt[i+1]&0xff) << 2)|((bt[i+2]&0xff) >> 6))&0x3f));
sb.append(base64.charAt((bt[i+2]&0xff)&0x3f));
}
add(sb, bt, index);
}else{
add(sb, bt, index);
}
return sb.toString();
}
public static void add(StringBuffer sb,byte [] bt,int index){
if(index > 0){
if(index == 1){// 1 个字节 假设 1100 1010
sb.append(base64.charAt((bt[bt.length-1]&0xff) >> 2));
sb.append(base64.charAt(((bt[bt.length-1]&0xff) << 4) &0x3f));
sb.append("=="); // 补一对00 加一个=
}
if(index == 2){//两个字节
sb.append(base64.charAt((bt[bt.length-2]&0xff) >> 2));
sb.append(base64.charAt((((bt[bt.length-2]&0xff) << 4)|((bt[bt.length-1]&0xff)>>4))&0x3f));
sb.append(base64.charAt(((bt[bt.length-1]&0xff) << 2) &0x3f));
sb.append("=");
}
}
}
/*******************************解密*******************************/
//代码中的base64_decode_map的作用就是将base64索引中的ASCII字符转换成原始的0-63的数字。
/* tatic int base64_decode_map[256] = {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0 - 15
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 16 - 31
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, // 32 - 47
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, // 48 - 63
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, // 64 - 79
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, // 80 - 95
-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 96 - 111
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, // 112 - 127
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 128 - 143
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 144 - 159
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 160 - 175
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 176 - 191
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 192 - 207
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 208 - 223
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 224 - 239
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 240 - 255
}; */
private static byte [] base64_decode_map=new byte[256];
static{
for (int i = 0; i < 256; i++) {
base64_decode_map[i]=-1;
}
for (int i = 'A'; i <= 'Z'; i++) {
base64_decode_map[i]=(byte) (i-'A');
}
for (int i = 'a'; i <= 'z'; i++) {
base64_decode_map[i]=(byte) (26+i-'a');
}
for (int i = '0'; i <= '9'; i++) {
base64_decode_map[i]=(byte) (52+i-'0');
}
base64_decode_map['+']=62;
base64_decode_map['/']=63;
}
public static String decoding(String str,String encoding){
char []data=str.toCharArray();
int len=((data.length+3)/4)*3;
if((data.length > 0)&& (data[data.length-1] == '='))
--len;
if((data.length > 1)&& (data[data.length-2] == '='))
--len;
byte[] out=new byte[len];
int index=0;
int shift=0;
int accum=0;
for (int i = 0; i < data.length; i++) {
int value=base64_decode_map[data[i] & 0xff];// data[i]个人感觉 在 和1111 1111进行与运算时 会转成ASCII码里对应的位置 例如 1 会转成49
if(value > 0)
{
accum <<= 6;
shift+=6;
accum|=value;
if(shift >= 8)
{
shift-=8;
out[index++]=(byte) ((accum >> shift) & 0xff);
}
}
}
if (index != out.length)
throw new Error("miscalculated data length!");
String outStr=null;
try {
outStr=new String(out,0,out.length,encoding);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("创建String错误",e);
}
return outStr;
}
}
可以打成 run的jar包 需要jdk的支持

