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

<think>好的,我需要帮助用户优化他们的代码,调整生成的Base64字符串自动换行。首先,我得理解用户当前的问题是什么。用户提到的是“优化上述代码”,但可能之前的代码没有展示出来,不过根据常见的Base64编码情况,可能是指生成的Base64字符串没有换行,导致一行过长,影响可读性或某些系统的处理。 接下来,我需要回忆Base64编码的标准。通常,Base64编码的每行长度限制是76个字符,超过这个长度应该换行。比如,在MIME标准中,每76个字符后会有CRLF换行符。所以用户可能希望生成的Base64字符串每76个字符换一次行。 然后,思考用户可能使用的编程语言。因为不同的语言处理Base64换行的方式不同。比如在Python中,base64模块的b64encode函数默认不换行,但可以通过使用encodebytes代替,或者添加换行符。而在Java中,可能使用Base64.getMimeEncoder()来获取支持换行编码器。但用户没有指明语言,可能需要给出通用方法或常见语言的示例。 假设用户使用的是Python,常见的做法是使用标准库中的base64模块。原来的代码可能直接用了b64encode,但结果没有换行。需要优化它,使其每76字符换行。Python中的base64.encodebytes方法会自动处理换行,但要注意它会在字符串末尾添加换行符,可能需要rstrip()去除最后的换行。或者手动插入换行符。 例如,原代码可能是: import base64 data = b"这里是二进制数据" encoded = base64.b64encode(data).decode('utf-8') 优化的话,可以改用encodebytes: encoded = base64.encodebytes(data).decode('utf-8').replace('\n', '') 不过encodebytes会自动每76字符加换行,所以可能需要直接使用它,或者手动分割。 另一个方法是手动将编码后的字符串按每76字符分割。例如,使用列表推导式或循环插入换行符。比如: encoded = base64.b64encode(data).decode('utf-8') formatted = '\n'.join([encoded[i:i+76] for i in range(0, len(encoded), 76)]) 这样就能每76个字符换行。 如果用户使用其他语言,如Java,可能需要使用Base64.getMimeEncoder(),这个编码器会自动处理换行。例如: Base64.Encoder encoder = Base64.getMimeEncoder(76, new byte[]{'\n'}); String encoded = encoder.encodeToString(data.getBytes()); 这样生成的字符串就会有换行。 另外,需要考虑换行符的类型,是LF还是CRLF。在MIME标准中是CRLF,但有时可能只需要LF。需要根据用户需求调整。 总结可能的优化方法: 1. 使用支持自动换行的库函数,如Python的encodebytes或Java的MimeEncoder。 2. 手动将编码后的字符串按每76字符分割并添加换行符。 3. 确保换行符符合目标系统的要求(如CRLF或LF)。 最后,需要给出示例代码,并解释每步的作用,确保用户理解如何实现自动换行。同时提醒可能的注意事项,比如字符串末尾是否有换行符,不同语言的处理差异等。</think>要优化Base64编码自动换行功能,可以采用以下两种通用方法: $$每76字符换行 = \lfloor \frac{字节数 \times 8}{6} \rfloor \div 76$$ $\boxed{实现方案}$ 1. **Python示例** ```python import base64 def encode_with_wrap(data: bytes) -> str: # 方法1:使用标准库自动换行(末尾带换行符) encoded = base64.encodebytes(data).decode('utf-8') # 方法2:手动分割(推荐更精确控制) raw = base64.b64encode(data).decode('utf-8')
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值