博客
关于我
Base64
阅读量:797 次
发布时间:2023-03-23

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

Base64的由来

Base64最早应用于解决电子邮件传输中的问题。在早期,电子邮件系统由于历史原因,只允许传输ASCII码字符。当尝试传输包含非ASCII字符的附件时,经过“历史问题”网关的处理可能导致非ASCII字符的二进制最高位被置为0,进而导致邮件收件人看到一封纯粹的乱码邮件。因此,Base64编码应运而生。

Base64是一种编码方式,而非加密方式。电子邮件附件通常采用Base64编码,因为这类附件可能包含不可见字符。尤其是根证书等需要在网上下载的证书,也会采用Base64编码。

  • 标准Base64包含64个字符(字母大小写、数字和符号+、/),以及用于结尾的等号
  • Base64将3个字节的数据编码为4个可打印字符,因此编码后的字符串长度总能被4整除(不计结尾的等号)
  • 等号用于结尾,且数量只能是0、1或2。这是因为如果原始数据长度不能被3整除,Base64会在结尾添加0个、1个或2个等号来补齐编码后的长度,以便正确解码。

Base64是一种将任意二进制数据转换为ASCII字符串的编码方法,广泛应用于URL、Cookie、网页等场景中,用于传输小段二进制数据、数字证书签名和加密密钥。

例如,将“123456”转换为二进制后得到: 00110001 00110010 00110011 00110100 00110101 00110110 将其分为6组6位二进制数,每组分别进行Base64编码,得到: 001100 010011 001000 110011 001101 000011 010100 110110 最终对应的Base64字符串为:MTIzNDU2

由于Base64编码可能包含+、/和等号,这些字符在URL中可能会引起问题。因此,常常会采用“URL safe”的编码方式,将+替换为-,/替换为_,并去掉或替换等号。这种编码方式更适合在URL、Cookie等场景中使用。

Base64编码与解码工具

以下是一个Java实现的Base64编码与解码工具类代码示例:

public class Base64Util {  
public static String encode(String src) {
BASE64Encoder encoder = new BASE64Encoder();
String encode = encoder.encode(src.getBytes());
return encode;
}
public static String decode(String encode) throws Exception {
BASE64Decoder decoder = new BASE64Decoder();
byte[] bytes = decoder.decodeBuffer(encode);
return new String(bytes);
}
/**
* 将Base64编码结果中的敏感字符+、/、=转换为_、-、.,并去除空格。
* @param source
* @return
* @throws Exception
*/
public static String urlSafeEncode(byte[] source) {
BASE64Encoder encoder = new BASE64Encoder();
String str = encoder.encode(source);
str = str.replaceAll("\\+", "_");
str = str.replaceAll("/", "-");
str = str.replaceAll("=", ".");
str = str.replaceAll("\\s", "");
return str;
}
/**
* URL safe Base64解码工具类方法
* @param str
* @return
* @throws IOException
*/
public static byte[] urlSafeDecode(String str) throws IOException {
if (str == null) {
return null;
}
str = str.replaceAll("_", "+");
str = str.replaceAll("-", "/");
str = str.replaceAll("\\.", "=");
BASE64Decoder decoder = new BASE64Decoder();
byte[] bytes = decoder.decodeBuffer(str);
return bytes;
}
public static void main(String[] args) throws Exception {
String encode = Base64Util.encode("123456");
String decode = Base64Util.decode(encode);
System.out.println("原文:" + decode);
System.out.println("编码后:" + encode);
System.out.println("编码后(URL safe):" + Base64Util.urlSafeEncode("123456".getBytes()));
}
}

在实际应用中,可以根据需求选择是否使用URL safe编码,以确保传输过程中不会引入不必要的字符冲突。记住,编码与解码过程中需要严格按照相同的转换规则进行,以避免数据丢失或解码失败。

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

你可能感兴趣的文章
Objective-C实现一分钟倒计时(附完整源码)
查看>>
Objective-C实现三次样条曲线(附完整源码)
查看>>
Objective-C实现上传文件到FTP服务器(附完整源码)
查看>>
Objective-C实现两数之和问题(附完整源码)
查看>>
Objective-C实现串口通讯(附完整源码)
查看>>
Objective-C实现串逐位和(附完整源码)
查看>>
Objective-C实现主存储器空间的分配和回收(附完整源码)
查看>>
Objective-C实现乘方运算---m的n次方(附完整源码)
查看>>
Objective-C实现二叉树遍历算法(附完整源码)
查看>>
Objective-C实现二进制和算法(附完整源码)
查看>>
Objective-C实现二进制补码算法(附完整源码)
查看>>
Objective-C实现互斥锁同步执行两个线程函数(附完整源码)
查看>>
Objective-C实现交易密码算法(附完整源码)
查看>>
Objective-C实现低通滤波器(附完整源码)
查看>>
Objective-C实现使用管道重定向进程输入输出(附完整源码)
查看>>
Objective-C实现借记款项功能(附完整源码)
查看>>
Objective-C实现关系矩阵A和B的乘积(附完整源码)
查看>>
Objective-C实现内存映射文件(附完整源码)
查看>>
Objective-C实现内存泄露检查(附完整源码)
查看>>
Objective-C实现内格尔·施雷肯伯格算法(附完整源码)
查看>>