码迷,mamicode.com
首页 > 其他好文 > 详细

Base64编码

时间:2016-09-26 06:25:15      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:

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编码

标签:

原文地址:http://www.cnblogs.com/weidiao/p/5907722.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!