在Android中如何连接Base64编码的字符串?

7

请帮我解决这个问题:

我有两个字符串,一个是用于电子邮件的id,另一个是密码,如下所示:

String name = "xyz@gmail.com";
String pass = "abc";

我将这两个内容编码成Base64字符串,如下:

String encoded_name = new String(Base64.encode(name.getBytes(), 0));
String encoded_pass = new String(Base64.encode(pass.getBytes(), 0));

我需要将这两个编码字符串用空格连接起来,如下:

String merge = encoded_name + " " + encoded_pass;

我通过控制台检查了这个字符串

System.out.print("Concatenate string= " + merge);

但是在控制台中,我的结果分为两行,就像这样。
11-18 00:25:29.898: INFO/System.out(1244): Merge= eHl6QGdtYWlsLmNvbQ==
11-18 00:25:29.908: INFO/System.out(1244):  YWJj

为什么会发生这种情况,结果对我来说是意外的,为什么它没有在一行中打印。请帮助我解决。

谢谢


我从未在Android中使用System.out来显示信息,你能试试Log类吗?Log.e("BASE64", merge); - Jordi Coscolla
检查您的Base64字符串是否以“换行符”结尾,或使用*String.trim()*将其删除。 - JimmyB
3个回答

22

您应该使用文档中描述的NO_WRAP标志,即Docs,Base64类不会添加额外的换行符。

NO_WRAP: 编码器标志位,用于省略所有行终止符(即输出将在一行上)。

因此,请将您的代码更改为以下内容:

String encoded_name = new String(Base64.encode(name.getBytes(), Base64.NO_WRAP));
String encoded_pass = new String(Base64.encode(pass.getBytes(), Base64.NO_WRAP));

这将输出以下内容:

11-17 19:16:51.283: INFO/System.out(354): Concatenate string= eHl6QGdtYWlsLmNvbQ== YWJj

1
请查看Android Api参考文档。它将解决有关Android中Base64编码/解码的所有其他查询。
另外一种更有效的解决问题的方法:
String encoded_name = Base64.encodeToString(name.getBytes("utf-8"), Base64.NO_WRAP);
String encoded_pass = Base64.encodeToString(pass.getBytes("utf-8"), Base64.NO_WRAP);

输出:-
11-17 10:55:27.492: V/BASE-64-.encodeToString(525): eHl6QGdtYWlsLmNvbQ== YWJj

0

看一下这个文档,MIME 部分指出:

MIME 并未为 Base64 编码的行规定固定的长度,但指定了最大行长为 76 个字符。此外,它还规定符合规范的解码器必须忽略任何额外的字母字符,虽然大多数实现使用CR/LF新行对来分隔编码行。

您应该只考虑删除第一个 base64 字符串的最后一个字符,因为看起来它是一个 \n(更通用的方法是测试它是不是)。

祝好, Stéphane


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接