简述

为什么叫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. Maven Package Plugins And Maven Test

    在使用Maven时候,大家避免不了使用大量插件: 1. maven-compiler-plugin 指定JDK版本和编码方式 ? ?compiler插件能解决2个问题: 第一:指定JDK版本--mav ...

  2. ubuntu sublime 破解

    1.去其官方网站http://www.sublimetext.com/ 把linux版下载下来,解开压缩包,放在你希望的路径下. 2.用vim将其打开 . vim sublime_text 3.将文件 ...

  3. [POST] What Is the Linux fstab File, and How Does It Work?

    If you’re running Linux, then it’s likely that you’ve needed to change some options for your file sy ...

  4. Notes of O_DIRECT flag

    What is O_DIRECT Starting with kernel 2.4, Linux allows an application to bypass the buffer cache wh ...

  5. 使用userAgent判断使用的是什么浏览器

    <script type="text/javascript"> function validB(){ var u_agent = Navigator.userAgent ...

  6. SoapUI利用Groovy把外部数据加载到request中

    默认已经用Groovy把外部数据给读取出来了,关键是读取出来后,如何加载到request中去?这里提供了两种方法:1.该Groovy脚本的名称是"setUp" def num = ...

  7. springboot(五):spring data jpa的使用

    在上篇文章springboot(二):web综合开发中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jpa 常见用法以及注意事项 使用spr ...

  8. STS 设置代码注释模板

    打开Window->Preferences->Java->Code Style->Code Templates <?xml version="1.0" ...

  9. OpenCV 学习笔记03 threshold函数

    opencv-python   4.0.1 简介:该函数是对数组中的每一个元素(each array element)应用固定级别阈值(Applies a fixed-level threshold) ...

  10. 跟我学SharePoint 2013视频培训课程——签出、签入文档(9)

    课程简介 第9天,怎样在SharePoint 2013中签出.签入文档 视频 SharePoint 2013 交流群 41032413