博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Base64编码
阅读量:7237 次
发布时间:2019-06-29

本文共 1767 字,大约阅读时间需要 5 分钟。

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));    }}

 

转载地址:http://gjgfm.baihongyu.com/

你可能感兴趣的文章
字典树
查看>>
单例模式的七种写法
查看>>
extjs_08_界面布局
查看>>
卷积神经网络(CNN)代码实现(MNIST)解析
查看>>
git 在命令行与图形状态下使用详情
查看>>
爱上MVC~Web.Config的Debug和Release版本介绍
查看>>
linux操作系统中oracle数据库的密码过期问题解决
查看>>
Spring中Bean的五个作用域
查看>>
hadoop之 distcp(分布式拷贝)
查看>>
Java后端程序员1年工作经验总结
查看>>
使用Vundle管理配置Vim的插件
查看>>
JDBC连接池&DBUtils使用
查看>>
可以通过shadowserver来查看开放的mdns(用以反射放大攻击)——中国的在 https://mdns.shadowserver.org/workstation/index.html...
查看>>
IOS系统控件高度
查看>>
Flink - ResultPartition
查看>>
2017.10.09 穆瑞课KUKA机器人培训视频的感想
查看>>
Jsoup
查看>>
python中的中文编码问题
查看>>
安卓播放音频
查看>>
in linux system of ftp command
查看>>