简述

为什么叫Base64?个人理解是,基础的64个字符。

而它的作用?用基础的(可理解为可安全传输的)64个字符,来表示难以表示的二进制或对程序造成干扰的字符。

Base64的编码过程

自行编码分析Base64的编码方式

Base64的编码范围

import org.junit.Test;

public class Base64Map {

	public static char[] chars = new char[64];

	static {
for (int i = 0; i < 26; i++) {
chars[i] = (char)((int)'A' + i);
}
for (int i = 26; i < 52; i++) {
chars[i] = (char)((int)'a' + i - 26);
}
for (int i = 52; i < 62; i++) {
chars[i] = (char)((int)'0' + i - 52);
}
chars[62] = '+';
chars[63] = '/';
} /**
* 获取对应的Base64字符
* @param index 下标
* @return 对应的Base64字符
*/
public static char getBase64(int index) {
return chars[index];
} @Test
public void printAll() {
System.out.println(chars);
} }

即:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

简单的二进制工具

import org.junit.Test;

public class BinaryUtils {

	/**
* 将多个字节转换为能打印的位
* @param b 多个字节
* @return 能打印的位
*/
public static String bytes2Bit(byte[] bytes) {
StringBuffer sb = new StringBuffer();
for (byte b : bytes) {
sb.append(BinaryUtils.byte2Bit(b));
}
return sb.toString();
} /**
* 将字节转换为能打印的位
* @param b 字节
* @return 能打印的位
*/
public static String byte2Bit(byte b) {
/* 备注:也可用JDK方法实现:Integer.toBinaryString() */ StringBuffer sb = new StringBuffer();
for (int i = 7; i >= 0; i--) { // 右移i位
sb.append((byte) ((b >> i) & 1));
}
return sb.toString();
} /**
* 二进制转换为十进制
* @param binary 二进制
* @return 十进制
*/
public static Integer binary2Decimal(String binary) {
if (binary == null || binary.trim().length() == 0) {
return null;
} binary = binary.trim();
char[] chars = binary.toCharArray(); int sum = 0;
for (int i = chars.length - 1; i >= 0; i--) {
if (chars[i] == '0') {
continue;
}
sum = sum + (int)Math.pow(2, chars.length - 1 - i);
}
return sum;
} @Test
public void bytes2BitTest() {
System.out.println(BinaryUtils.bytes2Bit("hello".getBytes()));
} @Test
public void byte2BitTest() {
System.out.println(BinaryUtils.byte2Bit("h".getBytes()[0]));
System.out.println(Integer.toBinaryString("h".getBytes()[0]));
} @Test
public void binary2DecimalTest() {
System.out.println(BinaryUtils.binary2Decimal("011010"));
} }

简单的编码过程


public class Base64Analyzer { public static void main(String[] args) {
/* TODO
* 此为练习,部分逻辑未实现:
* 1、无考虑补位到6、8的公倍数情况;
* 2、无考虑6位全部为补位,编码为=的情况
*/ /* 转换为二进制 */
String bitStr = BinaryUtils.bytes2Bit("hello".getBytes());
System.out.println(bitStr); int bitSize = 6;
String sixBitStr = null;
Integer index = null;
char base64Char;
StringBuffer base64SB = new StringBuffer();
for (int i = 0; i < bitStr.length(); i += 6) {
/* 二进制按6位分组 */
sixBitStr = bitStr.substring(i, i + 6 > bitStr.length() ? bitStr.length() : i + 6);
if (sixBitStr.length() != 6) {
sixBitStr = sixBitStr + String.format("%0" + (bitSize - sixBitStr.length()) + "d", 0); // 不足位后补0
} // 将每6位的字符转换为十进制
index = BinaryUtils.binary2Decimal(sixBitStr); // 根据下标获取对应的Base64字符
base64Char = Base64Map.getBase64(index);
System.out.println(sixBitStr + " -> " + base64Char);
base64SB.append(base64Char);
} System.out.println(base64SB.toString());
} }

日志:

0110100001100101011011000110110001101111
011010 -> a
000110 -> G
010101 -> V
101100 -> s
011011 -> b
000110 -> G
111100 -> 8
aGVsbG8

JDK转换Base64的方式

下例是JDK1.8的方法:

import java.util.Base64;

import org.junit.Test;

public class Base64Util {

	public static String encode(byte[] bytes) {
return Base64.getEncoder().encodeToString(bytes);
} public static byte[] decode(String s) {
return Base64.getDecoder().decode(s);
} @Test
public void encodeTest() {
System.out.println(Base64Util.encode("hello".getBytes()));
} @Test
public void decodeTest() {
System.out.println(new String(Base64Util.decode("aGVsbG8=")));
} }

参考文章

让你完全理解base64是怎么回事

【编码】Base64编码的更多相关文章

  1. 【字符编码】字符编码 && Base64编码算法

    一.前言 在前面的解决乱码的一文中,只找到了解决办法,但是没有为什么,说白了,就是对编码还是不是太熟悉,编码问题是一个很简单的问题,计算机从业人员应该也必须弄清楚,基于编码的应用有Base64加密算法 ...

  2. 001_从原理上搞定编码-- Base64编码

    开发者对 Base64编码肯定很熟悉,是否对它有很清晰的认识就不一定了.实际 上Base64已经简单到不能再简单了,如果对它的理解还是模棱两可实在不应该.大概介绍一下Base64的相关内容,花几分钟时 ...

  3. 从原理上搞定编码-- Base64编码

    BASE64是一种编码方式,通常用于把二进制数据编码为可写的字符形式的数据.这是一种可逆的编码方式.编码后的数据是一个字符串,其中包含的字符为:A-Z.a-z.0-9.+./共64个字符:26 + 2 ...

  4. python 应用 base64、hmac、hashlib包实现:MD5编码 base64编码解码、SHA256编码、urlsafe_b64encode编码等等基本所有的加密签名的方法

    用python做HTTP接口自动化测试的时候,接口的很多参数是经过各种编码加密处理后在传到后台的,这里列举出python实现 应用 base64.hmac.hashlib包实现:md5编码 sha1编 ...

  5. 网络安全——Base64编码、MD5、SHA1-SHA512、HMAC(SHA1-SHA512)哈希

    据说今天520是个好日子,为什么我想起的是502.500.404这些?还好服务器没事! 一.Base64编码 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之 ...

  6. 关于图片的Base64编码

    什么是Base64编码 Base64编码是一种图片处理格式,通过特定的算法将图片编码成一长串字符串,在页面上显示的时候,可以用该字符串来代替图片的url属性. base64编码就是长得像下面这样子的代 ...

  7. java base64编码、解码的三种方式

      java base64编码.解码 CreationTime--2018年7月24日10点38分 Author:Marydon 1.方式一:DatatypeConverter 说明:使用jdk自带的 ...

  8. 详解Base64编码和解码

    Base64是最常用的编码之一,比如开发中用于传递参数.现代浏览器中的<img />标签直接通过Base64字符串来渲染图片以及用于邮件中等等.Base64编码在RFC2045中定义,它被 ...

  9. JavaScript:详解 Base64 编码和解码

    Base64是最常用的编码之一,比如开发中用于传递参数.现代浏览器中的<img />标签直接通过Base64字符串来渲染图片以及用于邮件中等等.Base64编码在RFC2045中定义,它被 ...

  10. 自己用 python 实现 base64 编码

    自己用 python 实现 base64 编码 base64 编码原理 二进制文件中包含有很多无法显示和打印的字符,二进制的数据一般以 ASCII 码形式(8 bit,即一个字节)存储,8 bit 可 ...

随机推荐

  1. ios中ASIHTTPRequst的封装

    #import <Foundation/Foundation.h> #import "ASIHTTPRequest.h" #import "ASIDownlo ...

  2. KVM虚拟机的创建、管理与迁移

    [日期:2012-06-01] KVM虚拟机管理 一.环境 role         hostname    ip                  OS kvm_server   target   ...

  3. 使用Cygwin登录Raspberry PI

    偿试了很多ssh终端程序,像ScureCRT,Putty,SSHSecureShellClient,SSH Client Tunnelier,每个工具都有自己的特点,putty对中文的支持还算好的,其 ...

  4. 【DeepLearning】Exercise: Implement deep networks for digit classification

    Exercise: Implement deep networks for digit classification 习题链接:Exercise: Implement deep networks fo ...

  5. CentOS 开启防火墙 firewall ,mysql 远程访问

    最近在阿里云服务器centos上安装了mysql数据库,默认是不开启远端访问功能,需要设置一下防火墙,在开放默认端口号 3306时提示FirewallD is not running,经过排查发现是防 ...

  6. 【Android】Android模拟器的安装

    目录结构: contents structure [+] 使用VMware安装Android模拟器 安装安卓(Android)系统前VMware虚拟机的配置 安装安卓(Android)系统 安装安卓( ...

  7. FFmpeg 滤镜及其效果

    原文地址:https://blog.csdn.net/dangxw_/article/details/49001413 代码中使用滤镜参见上一篇博客:http://blog.csdn.net/dang ...

  8. 轻量级验证码生成插件webutil-licenseImage源码与实例应用

    webutil-licenseImage 插件内置4种验证码样式,支持用户扩展.自定义样式实现简单验证码. 源码脱管地址: http://code.google.com/p/licenseimage/ ...

  9. java字符串拼接的几种方式

    1. plus方式 当左右两个量其中有一个为String类型时,用plus方式可将两个量转成字符串并拼接. String a="";int b=0xb;String c=a+b;2 ...

  10. Vue Ssr之旅 —— Nuxt

    Nuxt 官方网站:https://nuxtjs.org/ 官方脚手架工具 Create-nuxt-app: https://github.com/nuxt-community/create-nuxt ...