Base64编码

 Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。一些如uuencode的其他编码方法,和之后binhex的版本使用不同的64字符集来代表6个二进制数字,但是它们不叫Base64。

public class Base64 {

    private static final String base64Code= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    public static String encode(String srcStr) {
        //有效值检查
        if(srcStr == null || srcStr.length() == 0) {
            return srcStr;
        }
        //将明文的ASCII码转为二进制位字串
        char[] srcStrCh= srcStr.toCharArray();
        StringBuilder asciiBinStrB= new StringBuilder();
        String asciiBin;
        for(int i= 0; i< srcStrCh.length; i++) {
            asciiBin= Integer.toBinaryString((int)srcStrCh[i]);
            while(asciiBin.length()< 8) {
                asciiBin= "0"+ asciiBin;
            }
            asciiBinStrB.append(asciiBin);
        }
        //根据明文长度在二进制位字串尾部补0
        while(asciiBinStrB.length()% 6!= 0) {
            asciiBinStrB.append("0");
        }
        String asciiBinStr= String.valueOf(asciiBinStrB);
        //将上面得到的二进制位字串转为Value,再跟据Base64编码表将之转为Encoding
        char[] codeCh= new char[asciiBinStr.length()/ 6];
        int index;
        for(int i= 0; i< codeCh.length; i++) {
            index= Integer.parseInt(asciiBinStr.substring(0, 6), 2);
            asciiBinStr= asciiBinStr.substring(6);
            codeCh[i]= base64Code.charAt(index);
        }
        StringBuilder code= new StringBuilder(String.valueOf(codeCh));
        //根据需要在尾部添加=
        if(srcStr.length()% 3 == 1) {
            code.append("==");
        } else if(srcStr.length()% 3 == 2) {
            code.append("=");
        }
        //每76个字符加一个回车换行符
        int i= 76;
        while(i< code.length()) {
            code.insert(i, "\r\n");
            i+= 76;
        }
        code.append("\r\n");
        return String.valueOf(code);
    }

    public static String decode(String srcStr) {
        //有效值检查
        if(srcStr == null || srcStr.length() == 0) {
            return srcStr;
        }
        //检测密文中=的个数后将之删除,同时删除换行符
        int eqCounter= 0;
        if(srcStr.endsWith("==")) {
            eqCounter= 2;
        } else if(srcStr.endsWith("=")) {
            eqCounter= 1;
        }
        srcStr= srcStr.replaceAll("=", "");
        srcStr= srcStr.replaceAll("\r\n", "");
        //根据Base64编码表将密文(Encoding)转为对应Value,然后转为二进制位字串
        char[] srcStrCh= srcStr.toCharArray();
        StringBuilder indexBinStr= new StringBuilder();
        String indexBin;
        for(int i= 0; i< srcStrCh.length; i++) {
            indexBin= Integer.toBinaryString(base64Code.indexOf((int)srcStrCh[i]));
            while(indexBin.length()< 6) {
                indexBin= "0"+ indexBin;
            }
            indexBinStr.append(indexBin);
        }
        //删除因编码而在尾部补位的0后得到明文的ASCII码的二进制位字串
        if(eqCounter == 1) {
            indexBinStr.delete(indexBinStr.length()- 2, indexBinStr.length());
        } else if(eqCounter == 2) {
            indexBinStr.delete(indexBinStr.length()- 4, indexBinStr.length());
        }
        String asciiBinStr= String.valueOf(indexBinStr);
        //将上面得到的二进制位字串分隔成字节后还原成明文
        String asciiBin;
        char[] ascii= new char[asciiBinStr.length()/ 8];
        for(int i= 0; i< ascii.length; i++) {
            asciiBin= asciiBinStr.substring(0, 8);
            asciiBinStr= asciiBinStr.substring(8);
            ascii[i]= (char)Integer.parseInt(asciiBin, 2);
        }
        return String.valueOf(ascii);
    }

    public static void main(String[] args) {
        System.out.print(encode("I like your long long shadow.It just seems you are unhappy to say goodbye to me."));
        System.out.print(decode("SSBsaWtlIHlvdXIgbG9uZyBsb25nIHNoYWRvdy5JdCBqdXN0IHNlZW1zIHlvdSBhcmUgdW5oYXBweSB0byBzYXkgZ29vZGJ5ZSB0byBtZS4="));

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值