Java实现Base64的编码与解码

Java实现Base64的编码与解码

什么是?

(基底64)是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。3个字节相当于24个比特,对应于4个单元Java实现Base64的编码与解码,即3个字节可由4个可打印字符来表示。在中的可打印字符包括字母A-Z、a-z、数字0-9base64加密 java,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。一些如的其他编码方法,和之后的版本使用不同的64字符集来代表6个二进制数字,但是不被称为。

常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括MIME的电子邮件及XML的一些复杂数据。

关于我们要明白的最重要的一点就是,他是一中编码格式,而不是加密算法。

编码索引表:

为什么会有这个东西出现?

的出现是为了让一些二进制数据可视化并且能够进行传输,存储。例如图片、音频、视频等。

会经常用作一个简单的“加密”来保护某些数据,而真正的加密通常都比较繁琐。

规则:

将3个字节变成4个字节。

如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:先使用0字节值在末尾补足,使其能够被3整除base64加密 java,然后再进行的编码。在编码后的文本后加上一个或两个=号,代表补足的字节数。也就是说,当最后剩余两个八位(待补足)字节(2个byte)时,最后一个6位的字节块有四位是0值base64加密 javaJava实现Base64的编码与解码,最后附加上两个等号;如果最后剩余一个八位(待补足)字节(1个byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号。

下面我们用Java实现算法:

首先我们要将的对照表存进一个char型数组中去,为了之后要用的时候可以直接查表打印。

public static char[] base64 = {
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K','L', 'M', 'N','O', 'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f','g', 
'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v','w', 'x', 
'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
};

以下是编码的代码:

private static List encodeToBase64(byte[] bytes) {
​
    //记录编码的字节数被3除的余数
        int num = bytes.length % 3;
​
        List stringList = new ArrayList();
        int v = 0;
        for (int i = 2; i < bytes.length; i += 3) {
            //用V来接收拼接后的数,由于byte数组中每一个是8位的二进制数,三个拼起来正好是24位
            v = ((bytes[i - 2] & 0xff) << 16) | ((bytes[i - 1] & 0xff) <>> 6 & 0x3f;//>>>为无符号的位运算
            int d2 = v >>> 12 & 0x3f;
            int d3 = v >>> 18 & 0x3f;
​
            //将取得的4组6位数据查表后存入List中
            stringList.add(String.valueOf(base64[d3]));
            stringList.add(String.valueOf(base64[d2]));
            stringList.add(String.valueOf(base64[d1]));
            stringList.add(String.valueOf(base64[d0]));
​
        }
    //下面的操作是当编码的字节数不能被3整除时,在末尾添加等于号
        if (num > 1) {
            v = ((bytes[bytes.length - 2] & 0xff) << 16) | ((bytes[bytes.length - 1] & 0xff) <>> 6 & 0x3f;
            int d2 = v >>> 12 & 0x3f;
            int d3 = v >>> 18 & 0x3f;
            stringList.add(String.valueOf(base64[d3]));
            stringList.add(String.valueOf(base64[d2]));
            stringList.add(String.valueOf(base64[d1]));
            stringList.add("=");
        }
        if (num == 1) {
            v = ((bytes[bytes.length - 1] & 0xff) <>> 12 & 0x3f;
            int d3 = v >>> 18 & 0x3f;
            stringList.add(String.valueOf(base64[d3]));
            stringList.add(String.valueOf(base64[d2]));
            stringList.add("=");
            stringList.add("=");
        }
    //输出编码后结果
        System.out.print("Base64 编码后:");
        for (String s : stringList) {
            System.out.print(s);
        }
        System.out.println();
        return stringList;
    }

相对编码来说,解码会更加简单些,代码如下:

private static void decode(String string) {
​
        byte[] b = new byte[string.length()];
        char[] ch = string.toCharArray();
        int n = 0;
    //遍历Base64表获取下标并存入byte数组
        for (char c : ch) {
            for (int i = 0; i < base64.length; i++) {
                if (c == base64[i]) {
                    b[n] = (byte) i;
                    n++;
                }
            }
        }
​
        int v = 0;
        byte[] bytes = new byte[string.length() - 1];
        int num = 0;
    //将4组合并,并且分为3组每组8位
        for (int i = 0; i < b.length; i += 4) {
            v = ((b[i] & 0xff) << 18) | ((b[i + 1] & 0xff) << 12) | (b[i + 2] & 0xff) <>> 8 & 0xff;
            int d2 = v >>> 16 & 0xff;
​
            bytes[num] = (byte) d2;
            bytes[num + 1] = (byte) d1;
            bytes[num + 2] = (byte) d0;
            num += 3;
​
        }
//去除byte数组末尾的0,末尾有0才去除
        if (bytes[bytes.length - 1] == 0){
            try {
                int length = 0;
                for (int i = 0; i < bytes.length; ++i) {
                    if (bytes[i] == 0) {
                        length = i;
                        break;
                    }
                }
                String str1 = new String(bytes,0,length);
                System.out.println("字符串 "+string+" Base64 解码后:"+str1);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }else{
​
        String s1 = new String(bytes);
        System.out.println("字符串 "+string+" Base64 解码后:"+s1);
        }
    }

最后我们只要调用方法就好了。

测试用例:

原始字符串:丢

编码后:5Lii

再用 解码后:丢

原始字符串:丢15as

编码后:==

再用 解码后:丢15as

想了解更详细的介绍可以点击链接:。

如果有不明白的地方也可以私信我哦~

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » Java实现Base64的编码与解码

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们