base64编码实现

本文详细介绍了Base64编码的基本原理,包括如何使用6个二进制位表示64个字符,以及如何将每3个字节转换为4个Base64字符。文章还解释了在处理不足3字节的情况时,如何通过添加0bit位进行填充,并使用等号表示这些额外的位,以便于解码。最后,提供了一个Java实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.ls.hfvj;

/**
 * 思路:base64只有64个字符,因此只需要6个二进制位来表示 实现:每3个字节为一组凑4个base64字符。
 * 多余一个字节补4个0bit位(共12位),凑成2个base64字符;多余两个字节补2个bit位(共18位),凑成3个base64字符。
 * 为了知道添加了bit位,(便于解码),一个=表示添加了2个bit位,两个=表示添加了4个bit位。
 *  @author lihao
 *  参:https://en.wikipedia.org/wiki/Base64
 */
public class Base64Encode {
	private static char[] TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
	private static int mask1 = 0x3F;// 00111111,取1-6位,从1开始编号
	private static int mask2 = mask1 << 6;// 取7-12位
	private static int mask3 = mask2 << 6;// 取13-18位
	private static int mask4 = mask3 << 6;// 取19-24位

	public static String encode(String str) {
		return encode0(str.getBytes());
	}

	public static String encode0(byte[] bytes) {
		int index1 = bytes.length / 3 * 3;//3N终点
		int i = 0;
		int groupVal = 0;//每3个字节为一组
		StringBuffer sb = new StringBuffer();
		while (i < index1) {
			groupVal = groupVal << 8;
			groupVal = groupVal | bytes[i];
			if (i % 3 == 2) {
				sb.append(TABLE[(groupVal & mask4) >>> 18]);
				sb.append(TABLE[(groupVal & mask3) >>> 12]);
				sb.append(TABLE[(groupVal & mask2) >>> 6]);
				sb.append(TABLE[(groupVal & mask1)]);
				groupVal = 0;
			}
			i++;
		}
		if (i != bytes.length - 1) {// 此时还剩多余的1或2个字节
			while (i < bytes.length) {
				groupVal = groupVal << 8;
				groupVal = groupVal | bytes[i];
				i++;
			}

			if (index1 == bytes.length - 1) {
				groupVal = groupVal << 4;// 补4bit0
				sb.append(TABLE[(groupVal & mask2) >>> 6]);
				sb.append(TABLE[(groupVal & mask1)]);
				sb.append("==");
			}
			if (index1 == bytes.length - 2) {
				groupVal = groupVal << 2;// 补2bit0
				sb.append(TABLE[(groupVal & mask3) >>> 12]);
				sb.append(TABLE[(groupVal & mask2) >>> 6]);
				sb.append(TABLE[(groupVal & mask1)]);
				sb.append("=");
			}
		}
		return sb.toString();
	}
	
	public static void main(String[] args) {
		String str="adbadngm";
		System.out.println(encode(str));
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值