在Java中对字符串进行Base64编码会使其长度翻倍。

huangapple go评论131阅读模式
英文:

Base64 encoding string in Java doubles its length

问题

问题

我正尝试在Java中将doc/pdf文件的内容编码为Base64字符串。
编码后的字符串长度几乎增加了一倍(115k -> 230k)。
然而,使用Python/PHP或任何在线工具对相同文件内容进行编码只会增加三分之一的大小(115k -> 154k)。

是什么原因导致Java中大小增加,是否有任何方法可以获得与其他源相同的结果?

代码

import java.util.Base64;
...

        //String content;
        System.out.println(content.length());
        String encodedStr = new String(Base64.getEncoder().encode(content.getBytes()));
        System.out.println(encodedStr.length());
        String urlEncodedStr = new String(Base64.getUrlEncoder().encode(content.getBytes()));
        System.out.println(urlEncodedStr.length());
        String mimeEncodedStr = new String(Base64.getMimeEncoder().encode(content.getBytes()));
        System.out.println(mimeEncodedStr.length());

输出

对于pdf文件:

115747
230816
230816
236890

对于doc文件:

13685
26392
26392
27086

英文:

Problem

I am trying to encode file contents of doc/pdf extensions to Base64 string in Java.
The encoded string length almost doubles from the original(115k -> 230k).
Whereas encoding the same file contents in Python/PHP or any online tool only gives a third increase(115k -> 154k).

What causes this increase in size for Java and is there any way to get equivalent result as the other sources?

Code

import java.util.Base64;
...

        //String content;
        System.out.println(content.length());
        String encodedStr = new String(Base64.getEncoder().encode(content.getBytes()));
        System.out.println(encodedStr.length());
        String urlEncodedStr = new String(Base64.getUrlEncoder().encode(content.getBytes()));
        System.out.println(urlEncodedStr.length());
        String mimieEncodedStr = new String(Base64.getMimeEncoder().encode(content.getBytes()));
        System.out.println(mimieEncodedStr.length());

Output

For pdf file

115747
230816
230816
236890

For doc file

13685
26392
26392
27086

答案1

得分: 1

首先,永远不要使用 new String。其次,将一个编码传递给 String.getBytes(String) 方法(例如 content.getBytes(encoding))。例如,

String encodedStr = Base64.getEncoder()
        .encodeToString(content.getBytes("UTF-8"));

或者

String encodedStr = Base64.getEncoder()
        .encodeToString(content.getBytes("US-ASCII"));
英文:

First, never use new String. Second, pass an encoding to String.getBytes(String) (e.g. content.getBytes(encoding)). For example,

String encodedStr = Base64.getEncoder()
        .encodeToString(content.getBytes("UTF-8"));

or

String encodedStr = Base64.getEncoder()
        .encodeToString(content.getBytes("US-ASCII"));

huangapple
  • 本文由 发表于 2020年10月6日 08:30:45
  • 转载请务必保留本文链接:https://go.coder-hub.com/64217802.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定