Base64编码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Base64编码相关的知识,希望对你有一定的参考价值。

Base64编码是一种编码,它不是MessageDigest(多对一映射),说它是一种密码有点牵强,因为这种密码太简单了,是最原始的密码.

对于一个byte[]b,按照它是大头序来顺次读取每一个bit,每个6位做一个分隔,所得结果也按照大头序来解析.

每个6位对应一个整数x,这个x决定了这个6位小分队应该用哪一个ascii码来表示.

编码前的24个bit变成了4个6位小分队,表现形式是4个byte,所以编码之后长度变为原来的4/3=1.3333倍.

下面给出Base64编码的java实现

import java.util.Base64;
import static java.lang.Math.*;
class BitStream {
    byte[] b;
    // 需要补上几个字节,1个或者2个
    int add;
    // 长度,编码之后包含多少个有效字符
    int length;
    public BitStream(byte[] b) {
        this.b = b;
        length = (int) ceil(b.length / 3.0 * 4);
        add = (3 - b.length % 3) % 3;
    }
    // 获取第x个bit,其中byte的最高位为第一个bit,次高位为第二个bit...也就是说此流为大头序
    int getBit(int x) {
        if (x >= b.length * 8)
            return 0;
        return (b[x / 8] & (1 << (7 - x % 8))) == 0 ? 0 : 1;
    }
    // 获取第x个字符,其中6x+0为最高位,6x+1为次高位...也就是此流为大头序
    int get(int x) {
        int ans = 0;
        for (int i = 0; i < 6; i++) {
            ans = ans << 1 | getBit(x * 6 + i);
        }
        return ans;
    }
}
public class Base64Test {
    static String encode(byte[] b) {
        // 首先构造字符映射
        String map = "";
        for (char c = ‘A‘; c <= ‘Z‘; c++) {
            map += c;
        }
        for (char c = ‘a‘; c <= ‘z‘; c++) {
            map += c;
        }
        for (char c = ‘0‘; c <= ‘9‘; c++) {
            map += c;
        }
        map += "+/";
        String ans = "";
        BitStream cin = new BitStream(b);
        for (int i = 0; i < cin.length; i++) {
            ans += map.charAt(cin.get(i));
        }
        // 添加了几个字符就add几个字符
        ans += "==".substring(0, cin.add);
        return ans;
    }
    public static void main(String[] args) {
        byte[] bytes = "魏印福ad".getBytes();
        String s = Base64.getEncoder().encodeToString(bytes);
        System.out.println(s);
        System.out.println(encode(bytes));
    }
}

 

以上是关于Base64编码的主要内容,如果未能解决你的问题,请参考以下文章

使用OpenSSL进行Base64编码和解码

令仔代码收藏系列----BASE64编码

什么是BASE64编码?

用于解码/编码修改后的 base64 URL 的代码

BASE64编码原理与Golang代码调用

c# Base64编码和图片的互相转换代码