- 浏览: 239895 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
DeepThought:
必须赞一个 用了各种方法 最终还是改了repo才能下载! Th ...
Android源码下载出现的问题 -
wj10000:
,这个不错呀,还准备用js 实现这个来着 ....
自己写jstl标签解析long时间 -
wjjxf:
xubingok 写道System.out.println是J ...
Android无法System.out.println出null -
xubingok:
System.out.println是JDK中的io流中的方法 ...
Android无法System.out.println出null -
JjayLee:
你可以更详细一点。。。
android网络连接Wifi和cmnet及cmwap的问题
base64编码的java实现
虽然有现成的库,自己也写了个,顺便学习一下忘记了很久的东西。
编码过程:参考wiki
将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6(因为26 = 64)个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。
如果最后剩下两个输入数据,在编码结果后加1个“=”;如果最后剩下一个输入数据,编码结果后加2个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。
下面开始实现:
首先需要实现2个函数,一个是将整数转化为二进制串,一个是将二进制串转化为整数。
整数转化为二进制串,书上说用辗转相除法,一直除2知道为1为止,让后讲模2的余数反过来即得。
参照jdk Integer类里的toBinaryString方法实现。可以通过移位和遮罩实现,此方法比辗转相处简短的多了。。
这是代码:
二进制转10进制则。一个个相乘即可:
下面开始base64编码,每3个byte处理,转化为二进制数组,放到一个24byte的数组里,然后每6个读取出来到一个8byte数组,下标从2开始
将这个byte数组再转化为byte,然后作为索引读取char值。。最后如果是0的数组要加=,最多加2个==。加了几个0就加几个=。比如只有一个字母d
要转化必须加2个byte 0的字节才够3个,因此转化结果最后2个字节为=
解码过程正好相反,每4个byte组合成一个24位的buffer,再组合成3字节的byte。直到最后,如果最后2个有一个为=。则跳出不用再转换了
其他的数据:主要是base64索引和值查询
这是测试数据和输出结果:
helloworld
aGVsbG93b3JsZA==
helloworld
虽然有现成的库,自己也写了个,顺便学习一下忘记了很久的东西。
编码过程:参考wiki
引用
将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6(因为26 = 64)个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。
如果最后剩下两个输入数据,在编码结果后加1个“=”;如果最后剩下一个输入数据,编码结果后加2个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。
下面开始实现:
首先需要实现2个函数,一个是将整数转化为二进制串,一个是将二进制串转化为整数。
整数转化为二进制串,书上说用辗转相除法,一直除2知道为1为止,让后讲模2的余数反过来即得。
参照jdk Integer类里的toBinaryString方法实现。可以通过移位和遮罩实现,此方法比辗转相处简短的多了。。
这是代码:
/** * 一个字节转化为8位二进制数列数组,数组的低序号表示二进制数列的高位,不足8位,高位补0 */ public static byte[] byteTo8BinaryBytes(byte t){ byte[] res = new byte[8]; /**移位**/ int mask = 1; int shift = 1; int pos = 8; do{ res[--pos] = (byte) (t & mask); t >>>= shift; }while(pos != 0);//总共才8位 /**通过辗转除2**/ /* if(t == 0)return res; int i=0; do{ res[i++] = (byte) (t%2); t = (byte) (t/2); if(t == 1){ res[i++] = (byte) t; break; } }while(true); //将res反过来 for(i=0; i< 4;i++){ byte b = res[i]; res[i] = res[7-i]; res[7-i] = b; } */ return res; }
二进制转10进制则。一个个相乘即可:
/** * 二进制字节数组转化为十进制整数,数组的低序号表示二进制数列的高位 */ public static int binaryBytesArrToInt(byte[] bytes){ int res = 0; int size = bytes.length; int pow2 = 1; for(int i= size-1; i>=0;i--){ byte b = bytes[i]; if(b == 1){ res += pow2; } pow2 = pow2 << 1; } return res; }
下面开始base64编码,每3个byte处理,转化为二进制数组,放到一个24byte的数组里,然后每6个读取出来到一个8byte数组,下标从2开始
将这个byte数组再转化为byte,然后作为索引读取char值。。最后如果是0的数组要加=,最多加2个==。加了几个0就加几个=。比如只有一个字母d
要转化必须加2个byte 0的字节才够3个,因此转化结果最后2个字节为=
/** * base64编码 * */ public static String encryptBase64(byte[] bytes){ byte[] buffer = new byte[24]; StringBuffer sb = new StringBuffer(); for(int i=0;i<bytes.length ;i+=3){ byte b1,b2,b3; b1 = bytes[i]; if(i + 1 <bytes.length){ b2 = bytes[i+1]; }else{ b2 = 0; } if(i + 2 <bytes.length){ b3 = bytes[i+2]; }else{ b3 = 0; } byte[] tbs = byteTo8BinaryBytes(b1); System.arraycopy(tbs, 0, buffer, 0, 8); tbs = byteTo8BinaryBytes(b2); System.arraycopy(tbs, 0, buffer, 8, 8); tbs = byteTo8BinaryBytes(b3); System.arraycopy(tbs, 0, buffer, 16, 8); //每次取6个 int idx = 0; do{ byte[] bt = new byte[8]; System.arraycopy(buffer, idx, bt, 2, 6); byte btb = (byte) binaryBytesArrToInt(bt); if(btb != 0){ sb.append(index[btb]); }else{ if(idx == 6){//最多只能有2个= sb.append(index[btb]); }else{ sb.append('='); } } idx += 6; if(idx >= 24)break; }while(true); } return sb.toString(); }
解码过程正好相反,每4个byte组合成一个24位的buffer,再组合成3字节的byte。直到最后,如果最后2个有一个为=。则跳出不用再转换了
/** * base64解码 */ public static byte[] decryptbase64(byte[] bytes){ //每4个byte组合成一个24位的buffer,再组合成3字节的byte。直到最后,如果最后2个有一个为=。则跳出不用再转换了 List<Byte> list = new ArrayList<Byte>(); for(int i=0; i<bytes.length ;i+=4){ byte c1 = bytes[i]; byte c2 = bytes[i+1]; byte c3 = bytes[i+2]; byte c4 = bytes[i+3]; c1 = getByteIndex(c1); c2 = getByteIndex(c2); c3 = getByteIndex(c3); c4 = getByteIndex(c4); byte[] buffer = new byte[24]; byte[] tbts = byteTo8BinaryBytes(c1); System.arraycopy(tbts, 2, buffer, 0, 6); tbts = byteTo8BinaryBytes(c2); System.arraycopy(tbts, 2, buffer, 0+6, 6); tbts = byteTo8BinaryBytes(c3); System.arraycopy(tbts, 2, buffer, 0+12, 6); tbts = byteTo8BinaryBytes(c4); System.arraycopy(tbts, 2, buffer, 0+18, 6); tbts = new byte[8]; byte temp; System.arraycopy(buffer, 0, tbts, 0, 8); temp = (byte) binaryBytesArrToInt(tbts); list.add(temp); if(bytes[i+2] == '=')break; System.arraycopy(buffer, 8, tbts, 0, 8); temp = (byte) binaryBytesArrToInt(tbts); list.add(temp); if(bytes[i+3] == '=')break; System.arraycopy(buffer, 16, tbts, 0, 8); temp = (byte) binaryBytesArrToInt(tbts); list.add(temp); } byte[] res = new byte[list.size()]; int i=0; for(Byte B:list){ res[i++] = B.byteValue(); } return res; }
其他的数据:主要是base64索引和值查询
private static byte getByteIndex(byte b){ if(b >= 'A' && b<= 'Z'){ return (byte) (b - 'A'); } if(b >= 'a' && b<= 'z'){ return (byte) (b - 'a' + 26); } if(b >= '0' && b<= '9'){ return (byte) (b - '0' + 52); } if(b == '+')return 62; if(b == '/')return 63; return 0; } private static final char[] index = new char[]{ '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','+','/' };
这是测试数据和输出结果:
String str = "helloworld"; log(str); String str0 = encryptBase64(str.getBytes()); log(str0); String str1 = new String(decryptbase64(str0.getBytes())); log(str1);
helloworld
aGVsbG93b3JsZA==
helloworld
发表评论
-
jdbc是否设置自动提交对性能的影响
2018-11-07 15:06 949项目中DB层会定时向mysql批量提交sql操作,之前是未设置 ... -
很久没写博客了
2018-10-27 10:30 2先激活下,有将近4年没有写实质性的博客内容了,这几年发生了很多 ... -
两年的项目开发一点小心得(二)
2013-06-20 23:31 903接着昨天 ... -
两年的项目开发一点小心得
2013-06-20 00:38 869从11年8月份 ... -
解决NSData中非法utf-8字节的问题
2012-05-13 13:12 4910当用nsdata,按照utf8编码来初始化nsstr ... -
练练手,用mina2.0搭建一个nio客户端
2012-05-08 16:03 6658练练手,用mina2.0搭建一个nio客户端,连接服务器。 ... -
android网络连接Wifi和cmnet及cmwap的问题
2011-10-27 23:43 4497困扰了我很久的,android ,http client无法直 ... -
C++学习小记
2011-07-05 23:23 1043很久没有写技术博客了,年后过来没有多少编程的工作, ... -
Java解惑读书笔记2
2011-05-07 11:10 1320从网上下的java解惑总共讲了61点,我拣一些,自己不知道的或 ... -
Java解惑读书笔记1
2011-05-07 10:14 10821。奇偶判断,应该用i%2 ... -
mongodb中mapreduce应该注意的问题
2011-03-15 14:46 1763今天用mongodb统计,老是出错误,在反复改和看官网文档后, ... -
如何计算一定的成功几率的结果
2010-12-15 11:37 972如何计算一定的成功几率的结果 经常遇到比如50%的成功概率,求 ... -
Mongodb如何保持数据正确更新
2010-11-29 15:26 2017Mongodb如何保持数据正确更新 所谓数据正确更新,就是在 ... -
自己开发的eclipse插件-生成java pojo字段名称
2010-11-25 14:20 2499自己开发的eclipse插件-生成java pojo字段名称 ... -
人人网小小战争辅助工具分析
2010-11-05 11:38 23128人人网小小战争辅助工具分析 话说,闲的会蛋疼。过不是,最近无 ... -
Eclipse环境下的新浪微博插件
2010-11-03 22:36 3542E博,Eclipse下的新浪微博插件。 业余时间开发的,已经实 ... -
webqq2协议分析和qq聊天机器人简单实现
2010-11-02 16:51 22933webqq2协议分析和qq聊天机器人简单实现 通过webqq ... -
随便写个Http Web Server 玩玩,当然是简单的。只能查看文件
2010-08-26 17:37 1212不说话,直接上代码: import java.io.Buff ... -
自定义jstl标签在resin下出错解决办法
2010-05-29 13:37 1253web.xml还是 <web-app version=& ... -
自己写jstl标签解析long时间
2010-05-23 22:56 6834数据库里存储的是long型的时间,现在想输出到jsp页面,由于 ...
相关推荐
总之,Java和JavaScript中Base64编码和解码的实现原理相似,都是将二进制数据转换为可打印的ASCII字符。Java自Java 8开始内置了Base64支持,而JavaScript则依赖于`btoa()`和`atob()`函数,或者使用第三方库。在实际...
实现BASE64编码和解码程序, 在类中实现如下函数并运行测试正确。 BASE64编码算法请在网上查询。 public String encode(byte[] data) { } public byte[] decode(String b) { }
下面我们将详细探讨Java中的Base64编码和解码原理及其实现方式。 Base64编码的基本思想是将每3个字节(24位)的数据转换为4个Base64字符(每个6位)。由于Base64字符集有64个字符,包括大小写字母、数字以及"+"和"/...
下面我们将详细介绍如何使用Java实现图片到Base64编码的转换。 为什么需要Base64编码 在网络传输和数据存储中,图片是一种二进制数据,它们可能会包含一些特殊字符,导致数据传输和存储出现问题。Base64编码可以将...
在Java中,我们可以使用`java.util.Base64`类来实现Base64的编码和解码。这个类是在Java 8中引入的,提供了方便的API来处理Base64的编码任务。 1. **Base64编码** 要对字节数组进行Base64编码,可以使用`java.util...
在Java中实现Base64编码,我们可以使用内置的`java.util.Base64`类,这个类提供了方便的方法来进行Base64的编码和解码。 Base64编码的原理是将每3个字节(24位)的数据分为4组,每组6位。由于ASCII码是7位的,因此6...
BASE64编码和解码的JAVA实现。 太简单了。直接调用API实现的。 反正不要分,你们看着下吧。
本文将深入探讨如何在JavaScript(JS)客户端和Java(Android)端实现3DES加密解密以及Base64编码解码,这对于保护用户敏感信息和实现安全通信至关重要。 首先,3DES(Triple Data Encryption Standard)是一种加强...
在Java中,可以使用`java.util.Base64`类库提供的API来实现Base64编码,但如果你希望手动实现这个过程,可以创建一个`Base64Encoder`类,包含上述步骤的函数,例如`encodeBytes(byte[])`。 下面是一个简单的手动...
"Java基于Base64实现编码解码图片文件" Java基于Base64实现编码解码图片文件是Java语言中的一种常见的编码解码实现方式。Base64是一种常用的字符编码,在很多地方都会用到,但它并不是安全领域下的加密解密算法,...
`javabase64-1.3.1.jar`可能提供了这种编码方式,具体实现取决于库的API。 注意,虽然这里介绍的是`javabase64-1.3.1.jar`库,但Java 8及更高版本已经内置了`java.util.Base64`类,提供了一套标准的Base64编码和...
android 开发中有时会需要用到base64加解密,其实base64并不算是一种加密的算法,只是一种基于64个可打印字符来表示二进制数据的表示方法。 google在android.util下提供了一个Base64工具类,可以很方便的用它encode...
标题"java-Base64编码"指的是使用Java语言实现的Base64编码和解码功能。在Java中,Base64编码主要涉及到以下几个知识点: 1. **`sun.misc.BASE64Decoder` 和 `sun.misc.BASE64Encoder`**: 这是Java早期版本中提供的...
在Java中,Base64的实现主要依赖于`java.util.Base64`类,这个类是在Java 8中引入的,提供了一系列的静态方法来完成Base64的编码和解码工作。下面我们将详细探讨如何在Java中实现Base64加密和解密: 1. **Base64...
java端:返回类型非字符接口调用StringUtils#base64AndCompressJson进行编码压缩 ,返回类型为字符接口调用StringUtils#base64Andcompress js 端:引入压缩包中的js文件 ,调用deBase64AndUncompress进行解压解码
在Java中,Base64编码和解码的功能主要通过`java.util.Base64`这个类来实现,该类在Java 8及以上版本中引入。下面将详细介绍如何使用这个类进行Base64的编码和解码操作。 首先,我们来看Base64编码的过程。编码的...
实现base64编码和解码。实现下面的类中的两个功能。 public class Base64 { /** 实现解码功能 */ public static byte[] decode(byte[] dest) { } /** 实现编码功能 */ public static byte[] encode(byte[] ...
在Java中,实现Base64编码和解码通常使用`java.util.Base64`类或Apache Commons Codec库中的`Base64`类。标准的Base64编码过程是将每3个字节的数据转换为4个6位的二进制数,然后将这些二进制数映射到编码表中的字符...
Base64 编码解码 Java ,Java对字符串Base64 编码解码的方法!!
这里的`Base64.encodeBase64()`和`Base64.decodeBase64()`方法分别实现了编码和解码功能,用法与Java 8中的`java.util.Base64`类似。 在实际应用中,Base64编码常用于电子邮件的附件、HTTP头的授权信息(如Basic...