传递{@code默认}将导致符合RFC 2045的输出。
我认为通过使用Base64.DEFAULT,我可以实现一个标准的编码行为,这可以很容易地在其他平台上找到。
Java Android
byte[] binary = new byte[80];
String output = Base64.encodeToString(binary, Base64.DEFAULT);
android.util.Log.i("CHEOK", unEscapeString(output));
binary = new byte[8];
output = Base64.encodeToString(binary, Base64.DEFAULT);
android.util.Log.i("CHEOK", unEscapeString(output));
public static String unEscapeString(String s){
StringBuilder sb = new StringBuilder();
for (int i=0; i<s.length(); i++)
switch (s.charAt(i)){
case '\n': sb.append("\\n"); break;
case '\t': sb.append("\\t"); break;
case '\r': sb.append("\\r"); break;
default: sb.append(s.charAt(i));
}
return "\"" + sb.toString() + "\"";
}我将从Android获得以下输出。
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\n"
"AAAAAAAAAAA=\n"似乎对Base64.DEFAULT来说,它有其行为
因此,我的iOS应用程序需要从安卓应用程序中交换数据。我注意到我可以模拟第一个行为(在第76个字符之后添加行提要('\n') )。
但是,不是第二种行为(在编码字符串的末尾添加行提要('\n') )
Swift iOS
import Foundation
var data = Data(count: 80)
var base64 = data.base64EncodedString(options: [.endLineWithLineFeed, .lineLength76Characters])
debugPrint(base64)
data = Data(count: 8)
base64 = data.base64EncodedString(options: [.endLineWithLineFeed, .lineLength76Characters])
debugPrint(base64)我从Swift iOS获得以下输出。
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
"AAAAAAAAAAA="这让我觉得,不管字符串长度如何,在编码字符串的末尾添加linefeed是一个行业标准吗?我如何在不同的平台上实现这种行为?
发布于 2022-09-22 19:41:20
事实证明,Android的默认base64编码会在每行第76个字符之后自动插入换行/行提要。
您可以使用Android的Base64.NODE_WRAP模式禁用此“功能”。例如:Base64.encodeToString(binary, Base64.NO_WRAP);
这一切为什么要发生?似乎没有人确切地知道,但这很可能是一种将二进制文件编码到电子邮件或usenet样式的内容中的方法,这些内容通常是在纯文本时代为80字符的宽度监视器格式化的。
有关这方面的一些提示,请参见base64。
https://stackoverflow.com/questions/57000417
复制相似问题