自己写的Base64编码

2023-05-16

自己写的Base64编码函数非常蹩脚,有待改进。

发现有一个错误。不能拿着用

/**
 * Base64转换用到了Java的位运算
 * & , |, >>, <<, >>>
 * http://zh.wikipedia.org/wiki/Base64
 */
public class Base64Demo{
	//Base64查询表
public static final char[] encodeLine={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X',
	'Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3',
	'4','5','6','7','8','9','+','/'};
	public static void main(String[] args){
		String name = "shao";
		String girl = "xinh";
		
		
		Base64Demo be = new Base64Demo();
		System.out.println(be.encode(girl.getBytes()));
		//利用一个大牛写的类来验证是否是正确的Base64编码
		//BASE64Encoder encoder = new BASE64Encoder();
		//System.out.println(encoder.encode(girl.getBytes()));
		
	}
	/*Base64编码*/
	protected String encode(byte[] buf){
		StringBuilder encodeResult = new StringBuilder();
		byte op;		//用来提取bit位
		byte oe;		//用来提取bit位
		
		//第1个字符分离	
		int oneh=0xfc;//11111100B
		int onel=0x03;//00000011B
		//第2个字符分离
		int twoh=0xf0;//11110000B
		int twol=0x0f;//00001111B
		//第3个字符分离
		int threeh=0xc0;//11000000B
		int threel=0x3f;//00111111B
		
		int count = buf.length / 3;
		
		
		for(int j=0;j<count;j++){
			for(int i=0;i<4;i++){
				if((j * 3+2) > buf.length){break;}
				switch(i){
				case 0:
					//第一组
					op = buf[j *3 + 0];
					op &= oneh;//01111000B
					//System.out.println(encodeLine[op>>>2]);
					encodeResult.append(encodeLine[op>>>2]);
				break;
				case 1:
					//第二组
					op = buf[j *3 + 0];
					oe = buf[j *3 + 1];
					op &= onel;
					oe &= twoh;
					op <<= 4;
					oe >>>= 4;
					//System.out.println(encodeLine[op | oe]);
					encodeResult.append(encodeLine[op | oe]);
				break;
				case 2:
					//第三组
					oe = buf[j *3 + 1];
					op = buf[j *3 + 2];
					//2字节低四位3自己接高二位
					oe &= twol;
					oe <<= 2;	//左移2位
					op &= threeh;
					op >>>=6;	//右移6位
					//System.out.println(encodeLine[oe | op]);	
					encodeResult.append(encodeLine[oe | op]);
				break;
				case 3:
					//第四组
					op = buf[j *3 + 2];
					op &= threel;
					//System.out.println(encodeLine[op]);	
					encodeResult.append(encodeLine[op]);
				break;
				}
				
			}
			
		}
		//字节数不是3的倍数的情况
		if(buf.length % 3 != 0){
			int k = buf.length % 3;
			if(k==1){
				op = buf[buf.length-1];
				op &= oneh;
				//System.out.println(encodeLine[op>>>2]);
				encodeResult.append(encodeLine[op>>>2]); 
				op = buf[buf.length-1];
				op &= onel;
				encodeResult.append(encodeLine[op << 4]);
				encodeResult.append("==");
			}else if(k==2){
				op = buf[buf.length-2];
				oe = buf[buf.length-1];
				op &= oneh;
				encodeResult.append(encodeLine[op>>>2]); 

				op = buf[buf.length-2]; op &= onel;
				oe &= twoh;
				op <<= 4;
				oe >>>= 4;
				encodeResult.append(encodeLine[op | oe]);

				oe = buf[buf.length-1];
				oe &= twol;
				encodeResult.append(encodeLine[oe<<2]);
				encodeResult.append("=");
			}
			
		}
		return encodeResult.toString();
	}
}


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自己写的Base64编码 的相关文章

随机推荐

  • 归并排序

    本文内容和代码来源于数据结构教材 归并排序 Merging Sort 是又一类不同的排序方法 34 归并 34 的含义是将2个或2个以上的有序表组合成1个新的有序表 无论是顺序存储还是链表存储结构 xff0c 都可在O m 43 n 的时间
  • 插入排序

    文章内容来源于数据结构教材 C语言版 教材讲解了4种插入排序算法 xff0c 分别为 1 直接插入排序 2 折半插入排序 3 2 路插入排序 4 表插入排序 还有一个希尔排序 属于插入排序分类 本文只将1 2 xff0c 两种算法进行了实践
  • 希尔排序

    本文内容来源于数据结构教材 C语言版 希尔排序 Shell s Sort xff0c 又称缩小增量排序 Diminishing Increment Sort xff0c 它也是一种属插入排序类的方法 xff0c 但在时间效率上较前几种插入排
  • Java swing绘制柱状图和饼图

    15 14编写程序 xff0c 使用条形图显示作业 平时测验 其中考试和期末考试占总成绩的百分比 假设作业占20 用红色显示 xff0c 平时测验占10 用蓝色显示 xff0c 其中考试占30 用绿色显示 xff0c 期末考试占40 用橙色
  • Java注解(Annotation)学习

    xff08 本文内容来源于疯狂Java讲义 xff0c 感谢 xff09 注解 Annotation Annotation是代码里的特殊标记 xff0c 这些标记可以在编译 类加载 运行时被读取 xff0c 并执行相应的处理 通过使用注解
  • Java Swing制作古老的打砖块游戏

    最近研究了一下古老的Java Swing xff0c 研究之余 xff0c 突发奇想开发了一个打砖块小游戏 首先看一下效果图 具体过程 1 游戏框架搭建1 1步骤 2 开发过程2 1各种游戏对象的绘制2 2游戏对象的运动2 3小球和砖块的碰
  • 局域网下yum代理配置

    需求背景 由于公司局域网内无法连接外网 xff0c 只有一台服务器能连接外网 xff0c 可选择搭建squid作为代理 xff0c 供无法访问外网的服务器 xff0c 安装软件使用 安装Squid yum install y squid 配
  • AndroidX迁移和吐槽

    最近引入一个第三方 xff0c 需要使用androidx扩展库 xff0c compile后发现与旧的support库无法兼容 xff0c 于是逐个的把support的库换成了androidx系列 xff0c 倒腾半天 xff0c 失败无数
  • Android中的事件

    有内容参考了别人的文章 xff0c 感谢作者 Input Events Event Listeners Event Handlers Touch Model Handling Focus https developer android co
  • Ubuntu19.10/20.04安装记录

    安装过程 官方网站下载 xff0c 搜索引擎搜索Ubuntu history version 找到19 10 xff0c 下载速度略慢 xff0c 大小大约2 3G 在Windows 上面使用UltraISO 试用版即可 刻录到u盘即可 重
  • android疑难问题收集

    1 自定义ViewGroup实现折叠展开 xff0c 离奇的折叠后又展开 在一个布局里面我参考网络代码实现了一个折叠展开的自定义viewgroup xff0c 其实是调用layout方法实现的折叠和展开 xff0c 最近出现一个bug xf
  • 开发错误笔记

    开发环境IDE Android Studio环境错误 1 布局引用的资源文件不存在的错误提示 Caused by android content res Resources NotFoundException Caused by org x
  • 程序员的送外卖经历

    今天我的一个朋友跟我发消息说 xff0c 看着外面刮着大风 xff0c 自己在屋子里面 xff0c 靠着暖气 xff0c 真是幸福啊 其实也没啥 xff0c 我这个朋友去年送了半年外卖 xff0c 大冬天依然在送 xff0c 户外骑着电动车
  • fragment添加失败错误查找

    根据源码查找原因 span class token class name Caused span by span class token operator span span class token class name span clas
  • Swing实现模仿HTML5模拟时钟特效

    自从研究了Java Swing的Graphics xff0c 觉得能按照自己的想法画出一些东西 xff0c 还是挺有意思的 xff0c 之前学习Java Swing的时候练习过一个模拟时钟 xff0c 自己觉得不错 xff0c 后来看到这个
  • jdk|adb命令行使用总结

    记录jdk的命令行使用记录 javac 1 java命令行编译多个源文件 javac d Example1 java Example2 java Example1是主类 xff0c 要用到Exmaple2 执行 xff1a java com
  • framework源码读后感

    View部分 1 ViewParent 今天查看了ViewGroup xff0c ViewRootImpl和ViewParent的部分源代码 xff0c 前面的两个类都实现了ViewParent接口 ViewGroup是一个抽象类 xff0
  • debian8 gnome 亮度调节

    debian8系统 xff0c 存在很多不兼容问题 xff0c 官方更新较慢 xff0c 但是电脑的硬件 xff0c 更新快 xff0c 很多驱动都无法在系统安装时给装好 xff0c 我装debian8系统时 xff0c 出了很多问题 例如
  • Android中图片占用内存的计算

    原帖 xff1a http blog csdn net hudashi article details 7856519 在Android开发中 xff0c 我现在发现很多人还不会对图片占用内存进行很好的计算 因此撰写该博文来做介绍 xff0
  • 自己写的Base64编码

    自己写的Base64编码函数非常蹩脚 xff0c 有待改进 发现有一个错误 不能拿着用 Base64转换用到了Java的位运算 amp gt gt lt lt gt gt gt a target blank href http zh wik