- 浏览: 510194 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (156)
- xml (4)
- web前端 (24)
- jQuery (18)
- java (38)
- SQL (9)
- perl (2)
- OTRS (1)
- GWT (4)
- Linux (32)
- Maven (2)
- Spring (2)
- Oracle Win7 (1)
- css (8)
- eclipse (3)
- mysql (11)
- tomcat (5)
- git (4)
- javascript (22)
- font (1)
- android (1)
- log4j (1)
- email (1)
- sublime plugin (1)
- html (2)
- matches (1)
- php (3)
- apache (3)
- gd (1)
- docker (5)
- rails (1)
- RabbitMQ (1)
- Ubuntu (3)
- L2TP VPN (1)
- nodejs (1)
- oraclejet (1)
- ubutun (1)
- ntp (1)
- ngix (1)
- ssl (1)
- https (1)
- Linux,Debian (2)
- dpkg (1)
- pac (1)
- vi (1)
- vim (1)
- java,http (0)
- httpClient (0)
- shutter (1)
- shell (1)
- redmine (1)
最新评论
-
纵观全局:
配置之后,连接显示不是私密连接
keytool生成证书与Tomcat SSL配置 -
zhuchao_ko:
可以 伪造
java获得ip地址 -
longhua2003:
代码太乱了
java下载文件 -
tomhat:
ccx410 写道 安装gwt报错,unable to ret ...
GWT CellTable -
ccx410:
安装gwt报错,unable to retrieve osgi ...
GWT CellTable
今天发现JDK1.4中的sun.misc.BASE64Encoder有两个问题
1)编码的字节较长时,encode出来的字符窜会在中间插入\n\r
比如
编码"中华人名共和国 呵呵呵呵呵呵呵呵呵呵呵呵呵中华人名共和国 呵呵呵呵呵呵呵呵呵呵呵呵呵"
生成的字符窜居然有两行,中间多了回车换行符。
2)效率较差(见后面的比较)
下面是我的实现:
public class BASE64Encoder {
private static char[] codec_table = { '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 BASE64Encoder() { }
public static String encode(byte[] a) {
int totalBits = a.length * 8;
int nn = totalBits % 6;
int curPos = 0;// process bits
StringBuffer toReturn = new StringBuffer();
while (curPos < totalBits) {
int bytePos = curPos / 8;
switch (curPos%8) {
case 0:
toReturn.append(codec_table[(a[bytePos]&0xfc)>>2]);
break;
case 2:
toReturn.append(codec_table[(a[bytePos]&0x3f)]);
break;
case 4:
if (bytePos == a.length - 1) {
toReturn.append(codec_table[((a[bytePos]&0x0f)<< 2)&0x3f]);
} else {
int pos = (((a[bytePos] & 0x0f) << 2) | ((a[bytePos + 1] & 0xc0) >> 6)) & 0x3f;
toReturn.append(codec_table[pos]);
}
break;
case 6:
if (bytePos == a.length - 1) {
toReturn.append(codec_table[((a[bytePos] & 0x03) << 4) & 0x3f]);
} else {
int pos = (((a[bytePos] & 0x03) << 4) | ((a[bytePos + 1] & 0xf0) >> 4))&0x3f;toReturn.append(codec_table[pos]);
}
break;
default:
//never hanppen
break;
}
curPos+=6;
}
if(nn==2) {
toReturn.append("==");
}
else if(nn==4){
toReturn.append("=");
}
return toReturn.toString();
}
}
这样运行一个测试程序
public static void main(String[] args) throws Exception {
BASE64Encoder encoder=new BASE64Encoder();
sun.misc.BASE64Encoder sunEncoder=new sun.misc.BASE64Encoder();
byte[] testBytes=new byte[1024*1024*2];
long start=System.currentTimeMillis();
for(int i=0;i<10;i++) {
sunEncoder.encode(testBytes);
}
System.out.println("[sun encoder]use time :"+(System.currentTimeMillis()-start));
start=System.currentTimeMillis();
for(int i=0;i<10;i++) {
encoder.encode(testBytes);
}
System.out.println("[our encoder]use time :"+(System.currentTimeMillis()-start));
}
出来的结果是:
[sun encoder]use time :4844
[our encoder]use time :2609
差不多慢一倍。
1)编码的字节较长时,encode出来的字符窜会在中间插入\n\r
比如
编码"中华人名共和国 呵呵呵呵呵呵呵呵呵呵呵呵呵中华人名共和国 呵呵呵呵呵呵呵呵呵呵呵呵呵"
生成的字符窜居然有两行,中间多了回车换行符。
2)效率较差(见后面的比较)
下面是我的实现:
public class BASE64Encoder {
private static char[] codec_table = { '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 BASE64Encoder() { }
public static String encode(byte[] a) {
int totalBits = a.length * 8;
int nn = totalBits % 6;
int curPos = 0;// process bits
StringBuffer toReturn = new StringBuffer();
while (curPos < totalBits) {
int bytePos = curPos / 8;
switch (curPos%8) {
case 0:
toReturn.append(codec_table[(a[bytePos]&0xfc)>>2]);
break;
case 2:
toReturn.append(codec_table[(a[bytePos]&0x3f)]);
break;
case 4:
if (bytePos == a.length - 1) {
toReturn.append(codec_table[((a[bytePos]&0x0f)<< 2)&0x3f]);
} else {
int pos = (((a[bytePos] & 0x0f) << 2) | ((a[bytePos + 1] & 0xc0) >> 6)) & 0x3f;
toReturn.append(codec_table[pos]);
}
break;
case 6:
if (bytePos == a.length - 1) {
toReturn.append(codec_table[((a[bytePos] & 0x03) << 4) & 0x3f]);
} else {
int pos = (((a[bytePos] & 0x03) << 4) | ((a[bytePos + 1] & 0xf0) >> 4))&0x3f;toReturn.append(codec_table[pos]);
}
break;
default:
//never hanppen
break;
}
curPos+=6;
}
if(nn==2) {
toReturn.append("==");
}
else if(nn==4){
toReturn.append("=");
}
return toReturn.toString();
}
}
这样运行一个测试程序
public static void main(String[] args) throws Exception {
BASE64Encoder encoder=new BASE64Encoder();
sun.misc.BASE64Encoder sunEncoder=new sun.misc.BASE64Encoder();
byte[] testBytes=new byte[1024*1024*2];
long start=System.currentTimeMillis();
for(int i=0;i<10;i++) {
sunEncoder.encode(testBytes);
}
System.out.println("[sun encoder]use time :"+(System.currentTimeMillis()-start));
start=System.currentTimeMillis();
for(int i=0;i<10;i++) {
encoder.encode(testBytes);
}
System.out.println("[our encoder]use time :"+(System.currentTimeMillis()-start));
}
出来的结果是:
[sun encoder]use time :4844
[our encoder]use time :2609
差不多慢一倍。
发表评论
文章已被作者锁定,不允许评论。
-
Apache HTTPClient 忽略证书
2019-01-25 15:03 1613/** * httpclient4.5.2版 * ... -
HTTP 返回码
2019-01-24 15:28 428HTTP1.1新增了五种请求方法:OPTIONS、PUT、PA ... -
Java SizeToHuman 大小转换为mb kb tb等
2017-08-21 15:12 1655public class TestSizeToHuman ... -
java常规格式化说明
2016-01-20 17:27 1384转 换 符说 明 ... -
java验证是否包含特殊字符/\:*?"<>
2016-01-05 15:25 8769public class MatchTest { ... -
JSP和JSTL获取服务器参数
2015-09-11 13:57 1200<%@ page language="java ... -
java计算时间差比较时间大小
2015-05-20 10:53 1122今天需要比较时间在网上找到然后写下: 比如:现在是:200 ... -
java发邮件
2014-11-19 15:37 1237一、 import java.util.Date; im ... -
java log4j.properties
2014-11-18 09:30 922log4j.properties配置文件如下: log4j ... -
java获得ip地址
2014-11-17 18:18 1330public String getIpAddr(Htt ... -
java下载文件
2014-11-07 10:57 1100// 文件名称中文乱码new String(filename. ... -
Android中RelativeLayout各个属性的含义
2014-10-11 15:06 878android:layout_above="@id ... -
Http发送请求
2014-09-17 15:01 902package wzh.Http; import j ... -
导出数据到excel
2014-09-03 16:20 1226/** * */ package com.chin ... -
Spring MVC @RequestBody接收JSON报HTTP 415/400问题的解决
2014-08-27 13:06 3812Ajax请求传@RequestBody(接收JSON)参数时, ... -
动态创建和修改Spring的bean配置文件
2014-08-06 18:23 43881、如果只是创建一个XML文件,那么只需要导入dom4j-1. ... -
request获取各种路径
2014-08-06 17:06 951从request获取各种路径总结 request.getRea ... -
Linux下设置开机自启动tomcat
2014-07-23 11:51 1956centos7 设置tomcat开机自启动 在tomcat/ ... -
Linux 设置环境变量JAVA_HOME ,鼠标右键打开终端,修改hostname
2014-07-03 14:21 1775一、ubuntu永久修改主机名 1、查看主机名 在Ubunt ... -
keytool生成证书与Tomcat SSL配置
2014-07-02 17:03 18176一、Keytool介绍 Keytool是一个Java数据证书 ...
相关推荐
描述中提到的"sun.misc"包是Java早期提供的一组实用工具类,其中包括了用于Base64编码和解码的`BASE64Encoder`和`BASE64Decoder`类。 1. **Base64编码原理**: Base64编码基于64个可打印字符,这些字符包括大小写...
在这个"BASE64Encoder.zip"压缩包中包含了一个名为"BASE64Encoder.jar"的文件,这很可能是一个Java实现的BASE64编码和解码工具。 在Java中,`java.util.Base64`类库提供了对BASE64编码和解码的支持。这个"BASE64...
Base64Encoder.jar包是Java开发中用于进行Base64编码和解码的工具包,它可以帮助开发者在处理数据时,将二进制数据转换为可打印的ASCII字符串,反之亦然。在Java标准库中,虽然已经包含了`java.util.Base64`类来执行...
在Java编程语言中,`sun.misc.BASE64Encoder`和`BASE64Decoder`是用于进行Base64编码和解码的内部类,它们属于`sun.misc`包,这是一个非公开(非标准)的Java库。`sun.misc`包中的类主要用于JVM内部使用,因此在官方...
在Java编程语言中,`sun.misc.BASE64Encoder` 和 `sun.misc.BASE64Decoder` 是两个用于Base64编码和解码的内部类,它们位于`sun.misc`包下。Base64是一种用于在网络上传输二进制数据的文本编码方式,它将任意的字节...
最近项目实验发现导入工具程序后项目有错,查看发现sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用,找不到相应的类。 二、原因分析 冲浪后发现JDK中的lib\tools.jar和JRE中的lib\rt.jar已从Java SE 9中...
在Java中,`BASE64Encoder`和`BASE64Decoder`是两个核心类,分别用于对数据进行BASE64编码和解码。 `BASE64Encoder`类: 这个类在Java SDK中位于`javax.crypto`包下,主要负责将字节序列(byte array)转换为BASE...
`sun.misc.BASE64Encoder`和`sun.misc.BASE64Decoder`就是这样的两个类,它们分别用于Base64编码和解码。 Base64是一种用于将二进制数据转换为可打印ASCII字符的编码方式,常用于在网络上传输二进制数据,如电子...
啥都不说了,CSDN都要30多分,抢钱啊,我着急下载,没有那么多分,对那些...android需要的BASE64Encoder的jar包,欢迎大家下载使用,为什么要5分,是因为,为了下载这么个破jar包,我花干了我的分,也是为了凑够字数。
在Java编程中,`sun.misc.BASE64Encoder` 类曾是Java标准库早期版本中用于进行Base64编码的一个工具类。然而,由于这个类属于Sun Microsystems的内部实现细节,自Java 9开始,它被标记为废弃,并在后续版本中逐步...
然而,需要注意的是,这两个类自JDK 9起已被弃用,建议使用`java.util.Base64`包中的`Base64.getEncoder()`和`Base64.getDecoder()`方法来进行BASE64的编码和解码工作。 #### 示例代码分析 给出的代码示例展示了...
`Base64.Encoder`接口代表Base64编码器,而`Base64.Decoder`接口代表Base64解码器。你可以通过`Base64.getEncoder()`和`Base64.getDecoder()`获取默认的编码器和解码器实例。例如: ```java import java.util.Base...
BASE64Encode 编码,在andorid没有这个编码,这里面有打成jar包,可以导进去。用源代码打包的。手懒不愿意自己弄得话,可以下载导进去。里面附带着源代码,也可将源代码开进去直接使用,希望能帮助大家。
在Java中,`sun.misc.BASE64Encoder`和`sun.misc.BASE64Decoder`是用于处理BASE64编码和解码的类,它们位于`sun.misc`包下,这是一个非公开的、由Sun Microsystems提供的包,主要用于JVM内部使用。 然而,需要注意...
在Java平台上,`sun.misc.BASE64Encoder`类被用来实现BASE64编码,但需要注意的是,这个类属于Java的非公开(sun.misc)包,官方并不推荐直接使用。 首先,我们来深入理解一下BASE64编码。BASE64编码是一种基于64个...
在早期的Java版本中,如JDK 1.4及更早版本,可以使用`sun.misc.BASE64Encoder`和`sun.misc.BASE64Decoder`类进行Base64操作,但这些类位于非公开的`sun.misc`包下,不是标准API,使用它们可能引发不兼容性问题,且不...
将BASE64Encoder编码与普通字节的互相转换,很好用!
sun.misc.BASE64Encoder 找不到jar包