java基础---->Base64算法的使用

  Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息。详细的Base64信息,可以参见维基百科:https://en.wikipedia.org/wiki/Base64。今天,我们开始java中base64算法的使用。

 

结构导航

  1.   Java自带的Base64算法
  2.   commons-codec的Base64算法
  3.   bouncycastle的Base64算法
  4.   自定义的base64算法
  5.   友情链接

 

Java自带的Base64算法

 项目结构如下

一、 引入jdk自带的rt.jar包

要使用Base64Encoder,却发现在Eclipse中无法找到该类,原来Base64Encoder并不属于JDK标准库范畴,但是又包含在了JDK中。

问题的解决方案: Project->Properties,选择Java Build Path设置项,再选择Libraries标签,Add External Jars添加%JAVA_HOME%\jre\lib\rt.jar就行。

 

二、 我们通过junit方法,来加以对Base64算法的测试,明文:my name is huhx。

private static String src = "my name is huhx";

@Test
public void huhxBase64() {
    try {
        BASE64Encoder encoder = new BASE64Encoder();
        String encode = encoder.encode(src.getBytes());
        System.out.println("encode: " + encode);

        BASE64Decoder decoder = new BASE64Decoder();
        String decode = new String(decoder.decodeBuffer(encode));
        System.out.println("decode: " + decode);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

 

三、 运行结果如下:

encode: bXkgbmFtZSBpcyBodWh4
decode: my name is huhx

 

commons-codec的Base64算法

一、 引入commons-codec-1.10.jar包,提供对base64算法的支持

commons-codec-1.10.jar地址:https://www.bouncycastle.org/latest_releases.html

 

二、 我们通过junit方法,来加以对Base64算法的测试,明文:my name is huhx。

@Test
public void commonCodeBase64() {
    byte[] encodeBytes = Base64.encodeBase64(src.getBytes());
    System.out.println("encode: " + new String(encodeBytes));

    byte[] decodeBytes = Base64.decodeBase64(encodeBytes);
    System.out.println("decode: " + new String(decodeBytes));
}

 

三、 运行结果如下: 

encode: bXkgbmFtZSBpcyBodWh4
decode: my name is huhx

 

bcprov的Base64算法

一、 引入bcprov-jdk15on-154.jar,提供对base64算法的支持

bcprov-jdk15on-154.jar地址: https://commons.apache.org/proper/commons-codec/download_codec.cgi

 

二、 我们通过junit方法,来加以对Base64算法的测试,明文:my name is huhx。

@Test
public void bouncyCodeBase64() {
    byte[] encodeBytes = org.bouncycastle.util.encoders.Base64.encode(src.getBytes());
    System.out.println("encode: " + new String(encodeBytes));

    byte[] decodeBytes = org.bouncycastle.util.encoders.Base64.decode(encodeBytes);
    System.out.println("decode: " + new String(decodeBytes));
}

 

三、 运行结果如下:

encode: bXkgbmFtZSBpcyBodWh4
decode: my name is huhx

 

自定义的base64算法

一、 HuhxBase64.java的自定义算法,内容如下:

package com.huhx.base64.jdk;

/**
 * writer: huhx
 */
public class HuhxBase64 {
    private static final String CODES = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

    // base64解密
    private static byte[] base64Decode(String input) {
        if (input.length() % 4 != 0) {
            throw new IllegalArgumentException("Invalid base64 input");
        }
        byte decoded[] = new byte[((input.length() * 3) / 4) - (input.indexOf('=') > 0 ? (input.length() - input.indexOf('=')) : 0)];
        char[] inChars = input.toCharArray();
        int j = 0;
        int b[] = new int[4];
        for (int i = 0; i < inChars.length; i += 4) {
            // This could be made faster (but more complicated) by precomputing
            // these index locations.
            b[0] = CODES.indexOf(inChars[i]);
            b[1] = CODES.indexOf(inChars[i + 1]);
            b[2] = CODES.indexOf(inChars[i + 2]);
            b[3] = CODES.indexOf(inChars[i + 3]);
            decoded[j++] = (byte) ((b[0] << 2) | (b[1] >> 4));
            if (b[2] < 64) {
                decoded[j++] = (byte) ((b[1] << 4) | (b[2] >> 2));
                if (b[3] < 64) {
                    decoded[j++] = (byte) ((b[2] << 6) | b[3]);
                }
            }
        }
        return decoded;
    }

    // base64加密
    private static String base64Encode(byte[] in) {
        StringBuilder out = new StringBuilder((in.length * 4) / 3);
        int b;
        for (int i = 0; i < in.length; i += 3) {
            b = (in[i] & 0xFC) >> 2;
            out.append(CODES.charAt(b));
            b = (in[i] & 0x03) << 4;
            if (i + 1 < in.length) {
                b |= (in[i + 1] & 0xF0) >> 4;
                out.append(CODES.charAt(b));
                b = (in[i + 1] & 0x0F) << 2;
                if (i + 2 < in.length) {
                    b |= (in[i + 2] & 0xC0) >> 6;
                    out.append(CODES.charAt(b));
                    b = in[i + 2] & 0x3F;
                    out.append(CODES.charAt(b));
                } else {
                    out.append(CODES.charAt(b));
                    out.append('=');
                }
            } else {
                out.append(CODES.charAt(b));
                out.append("==");
            }
        }
        return out.toString();
    }

    public static void main(String[] args) {
        String input = "I love you, huhx!";
        String encode = base64Encode(input.getBytes());
        System.out.println("encode: " + encode);

        String decode = new String(base64Decode(encode));
        System.out.println("decode: " + decode);
    }
}

 

二、 运行结果如下:

encode: SSBsb3ZlIHlvdSwgaHVoeCE=
decode: I love you, huhx!

 

友情链接

 

转载于:https://www.cnblogs.com/huhx/p/javaBase64.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值