Java 8 Base64编码(基本)不再添加新行。我该如何重新实现呢?

时间:2015-06-21 06:43:02

标签: java base64 blob stringbuilder

我基本上有相反的问题

new-line-appending-on-my-encrypted-string

似乎旧的Java Base64实用程序在返回字符串时总是每76个字符添加一行,但使用以下代码,我不会得到我需要的那些休息。

    Path path = Paths.get(file);
    byte[] data = Files.readAllBytes(path);
    String txt= Base64.getEncoder().encodeToString(data);

是否有一种简单的方法可以告诉编码器添加换行符?

我尝试过实现一个stringbuilder来插入换行符,但它最终改变了整个输出(我将文本从java控制台复制到HxD编辑器,并与我已知的工作' BLOB&#39进行比较;换行)。

    String txt= Base64.getEncoder().encodeToString(data);

    //Byte code for newline
    byte b1 = 0x0D;
    byte b2 = 0x0A;     

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < txt.length(); i++) {
        if (i > 0 && (i % 76 == 0)) {
            sb.append((char)b1);
            sb.append((char)b2);

        }

        sb.append(txt.charAt(i));
    }

编辑(回答问题):

这不是最简单的解释,但是当我不使用字符串构建器时,编码的输出将如下所示:

AAAAPAog4lBVgGJrT2b + mQVicHN3d //////// 3hhcDJiLWVtMjUwLWVtMjUwLWRldjA0NTUAAAAAAA

但我希望它看起来像这样:

AAAAPAog4lBVgGJrT2b + mQVicHN3d //////// 3hhcDJiLWVtMjUwLWVtMjUwLWRldjA0NTUAAAAA..AA

如您所见,&#34; ..&#34;表示0x0D和0X0A或换行符,它在第76个字符处插入(这是旧base64输出的内容)。

但是,当我在第76个字符后追加字节b1和b2(换行符)时,输出变为:

BPwAFHwA0CUFoG8AgDRCAAIlQgAAJUIAAhUfNEIAAiUkmw / 0fADQFSInART / ADUlfADQFQE0fADQ ..

所以它看起来像&#34; ..&#34;是在正确的位置,但它之前的一切都是不同的。

谢谢!

2 个答案:

答案 0 :(得分:5)

您想要getMimeEncoder代替:

  

MIME

     

使用&#34; Base64字母&#34;如RFC 2045的表1中所规定的用于编码和解码操作。 编码输出必须以不超过76个字符的行表示,并使用回车符&#39; \ r&#39;紧接着是一个换行符&#39; \ n&#39;作为行分隔符。没有行分隔符添加到编码输出的末尾。在解码操作中,将忽略base64字母表中未找到的所有行分隔符或其他字符。

(强调我的)

请注意,编码方案与getEncoder中的基本编码器相同 - 它们都来自RFC 2045。

答案 1 :(得分:0)

今天我用以下代码分割了X509Certificate的Base64表示:

StringBuilder sb = new StringBuilder();
int chunksCount = str.length()/76;
for(int i=0;i<chunksCount;i++){
    sb.append(str.substring(76*i,76*(i+1))).append("\r\n");
}
if(str.length() % 76 != 0) sb.append(str.substring(76*chunksCount)).append("\r\n");

我认为,添加大部分比迭代每个字母更好。此外,一些库为Base64编码器提供了特殊参数,允许拆分所需的部件大小,但我不得不使用一些没有这种功能的库。