【问题标题】:Is it ok to remove newline in Base64 encoding在Base64编码中删除换行符是否可以
【发布时间】:2013-11-13 11:30:32
【问题描述】:

我的 java 应用程序使用 base64 编码,它在每 76 个字符后添加一个新行 (\n)。我需要将此编码字符串放在属性文件中,换行符会破坏功能。

当我执行encodedString.replaceAll("\n", ""); 时,一切正常,但我只是想确保这是预期的,我没有引入隐藏的问题。

【问题讨论】:

  • 如果您使用java.util.Properties 来保存它应该正确处理换行符的值。
  • 我对 Poco::Base64Encoder 有同样的问题,你需要使用选项Poco::Base64Encoder encoder{encoded, Poco::BASE64_URL_ENCODING};
  • 可以使用Base64.encodeToString(decodedData,Base64.NO_WRAP),NO_WRAP会生成没有CRLF的编码数据

标签: java base64


【解决方案1】:

对于许多无法处理长行的旧程序来说,必须将 base64 编码的字符串分成多行。用 Java 编写的程序通常可以处理长行,因为它们不需要自己进行内存管理。只要您的行少于 6400 万个字符,应该没有问题。

而且由于您不需要换行符,因此如果可能,您根本不应该生成它们。

【讨论】:

  • llling,在 android 中它们是自动生成的,我该如何防止这种情况发生。
  • @Pankaj_Nimgade 使用 Base64.NO_WRAP 标志。
  • 更新:在 Java 8 中,使用 java.util.Base64BasicURL 和文件名安全 编码器不添加行分隔符。详情here
  • @ChrisNash - 你的解决方案帮助了我......它对我有用
  • 要解码包含换行符的字符串,应该使用 java.util.Base64.getMimeDecoder().decode(message)。
【解决方案2】:

一些 Base64 编码器会将 EOL 字符(如 CRLF ('\r\n'))附加到编码的字符串中。您可以使用Base64.encodeBase64URLSafe 摆脱它们:

使用 base64 算法的 URL 安全变体对二进制数据进行编码,但不对输出进行分块。 url-safe 变体发出 - 和 _ 而不是 + 和 / 字符。注意:没有添加填充。

【讨论】:

【解决方案3】:

您只需要按照以下方式使用Base64编码

Base64.encodeBase64String("Your data to encrypt in base64")

将以上行改为以下内容

Base64.encodeBase64String("Your data to encrypt in base64",Base64.NO_WRAP)

这将解决您的问题。

【讨论】:

  • 也许这在 Java 中有效,但在 PERL 中,它只能在一定程度上有效。它只是破坏了换行符所在的输出字符串:“ ... XBhb2RlBase64NO_WRAPdGVyMjAw ...”
【解决方案4】:

encodedString.replaceAll("\n", "");

确实在 Java Mime 编码器中引入了一个“隐藏的问题”,我只好解决它。

这些行由“\r\n”分隔,而不仅仅是“\n”,因此您的替换会在某些地方留下“\r”,这些被大多数程序忽略,但不是所有程序。 例如,我在使用 GitHub API 时必须为文件生成包含 base42-mime 编码的 JSON,我只是在 encodeString.replaceAll("\n", "") 字符串之前和之后添加 (") ...好吧..它没有工作,因为剩下的\r...

【讨论】:

    【解决方案5】:

    这应该不是问题,因为许多解码器能够在没有换行符的情况下解码编码文本。最安全的选择是自己进行解码并进行验证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-16
      • 2013-07-01
      • 1970-01-01
      • 2019-03-28
      • 2015-08-14
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多