Base64 编码图片被自动换行

本文主要介绍了在Android和Eclipse中遇到Base64编码图片时自动换行的问题,分析了原因,并提供了两种解决方案:重写sun.*包的Base64编码或切换到java.util.Base64包。同时,针对Android环境,提出了修改编码参数Base64.NO_WRAP的建议。

一.问题由来

问题如题,这种情况在使用android 和 eclipse中都碰到.

1. 环境介绍

android 中使用 import android.util.Base64.*;

eclipse 中使用
import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;

2. 问题详情

使用Base64编码图片为字符串,发送给服务器,服务器收到的字符串是一段一段的,并不没有一次性接受所有的字符串.

二.查询资料

为解决这个问题,我查询了base64的各种资料.

1.历史由来

Java一直缺少BASE64编码API,以至于通常在项目开发中会选用第三方的API实现.

刚开始,sun公司的sun.misc.BASE64Encoder的base64包使用较多,由于是公司内部使用,对外支持不好,时常出现导包错误,现在不推荐使用.

详情参见oracle 公司的公告: Why Developers Should Not Write Programs
That Call ‘sun’ Packages

The sun.* packages are not part of the supported, public interface.
A Java program that directly calls into sun.* packages is not guaranteed to work on all Java-compatible platforms. In fact, such a program is not guaranteed to work even in future versions on the same platform.

意思是sun.* 这样的包对java程序的支持不好,会导致程序不能工作.

后来,oracle自己弄了一个base64的包,

import org.apache.commons.codec.binary.Base64;

这个包就没那么多问题,具体使用方法如下:

byte[] encodedBytes = Base64.encodeBase64(“Test”.getBytes());
System.out.println(“encodedBytes ” + new String(encodedBytes));
byte[] decodedBytes = Base64.decodeBase64(encodedBytes);
System.out.println(“decodedBytes ” + new String(decodedBytes));

再后来,Java 8实现了BASE64编解码API,它包含到java.util包,从此 base64 名正言顺.

import java.util.Base64;

具体使用如下:

byte[] encodedBytes = Base64.getEncoder().encode(“Test”.getBytes());
System.out.println(“encodedBytes ” + new String(encodedBytes));
byte[] decodedBytes = Base64.getDecoder().decode(encodedBytes);
System.out.println(“decodedBytes ” + new String(decodedBytes));

关于java 8 中base64 更详细的介绍请查看:
BASE64Java 8实现BASE64编解码

三.原因分析

由于我使用sun.* 和 android.util.base64.*包,用Base64编码的时候如果出现\n 之类的字符,Java中转义。
当字符串过长(一般超过76)时会自动在中间加一个换行符,字符串最后也会加一个换行符。

而现在使用的java.util.Base64; 没有这个特点.

四.解决方案

对于eclipse,

1. 继续使用sun.* 包

重写base64 编码.

具体实现可参照 重写BASE64Encoder

2. 换用其他包,比如 java.util.Base64包

具体使用方法请查看官网使用文档.

对于android,

将android.util.Base64.encodeToString(input, Base64.DEFAULT)
换成
Android.util.Base64.encodeToString(input, Base64.NO_WRAP);

参考资料

1.Base64 Encoding in Java

2.Base64编码的 换行 转义

3.Java 8实现BASE64编解码

4.重写BASE64Encoder

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值