Java 8 Base64 Encode (Basic) 不再添加新行。我怎样才能重新实现这个?

Java 8 Base64 Encode (Basic) doesn't add new line anymore. How can I reimplement this?

我基本上有完全相反的问题

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' 换行)。

    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

如您所见,“..”代表 0x0D 和 0X0A 或换行符,它被插入到第 76 个字符(这是旧的 base64 会输出的内容)。

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

BPwAFHwA0CUFoG8AgDRCAAIlQgAAJUIAAhUfNEIAAiUkmw/0fADQFSInART/ADUlfADQFQE0fADQ..

所以看起来“..”在正确的位置,但它之前的一切都不一样。

谢谢!

您需要 getMimeEncoder

MIME

Uses the "The Base64 Alphabet" as specified in Table 1 of RFC 2045 for encoding and decoding operation. The encoded output must be represented in lines of no more than 76 characters each and uses a carriage return '\r' followed immediately by a linefeed '\n' as the line separator. No line separator is added to the end of the encoded output. All line separators or other characters not found in the base64 alphabet table are ignored in decoding operation.

(强调我的)

请注意,编码方案在其他方面与 getEncoder 中的基本编码器相同 - 它们均源自 RFC 2045。

今天我用以下代码拆分了 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 编码器,允许按所需的部分大小进行拆分,但我不得不使用一些没有这种功能的库。