【发布时间】:2019-03-29 17:10:44
【问题描述】:
我在尝试用 Java 编码 String 时遇到了问题。
我有以下 C# 代码,以及 string Bpz2Gjg01d7VfGfD8ZP1UA==,当我执行 C# 代码时,我得到:
QnB6MkdqZzAxZDdWZkdmRDhaUDFVQT090
public static void Main(string[] args)
{
string strWord = "Bpz2Gjg01d7VfGfD8ZP1UA==";
byte[] encbuff = Encoding.UTF8.GetBytes(strWord);
string strWordEncoded = HttpServerUtility.UrlTokenEncode(encbuff);
Console.WriteLine(strWordEncoded);
}
我试图在 Java 中复制以前的代码,在第一个
尝试我使用了javax.xml.bind.DatatypeConverterClass:
public static void main(String[] args) {
String strWord = "Bpz2Gjg01d7VfGfD8ZP1UA==";
byte[] encbuff = strWord.getBytes(StandardCharsets.UTF_8);
String strWordEncoded = DatatypeConverter.printBase64Binary(encbuff);
System.out.println(strWordEncoded);
}
但我收到了以下String (
与 C# 相比,缺少最后一个零 string):
QnB6MkdqZzAxZDdWZkdmRDhaUDFVQT09
在第二次尝试中,我使用了 BouncyCastle Base64 编码器:
public static void main(String[] args) {
String strWord = "Bpz2Gjg01d7VfGfD8ZP1UA==";
byte[] encbuff = strWord.getBytes(StandardCharsets.UTF_8);
String strWordEncoded = new String(Base64.encode(encbuff));
System.out.println(strWordEncoded);
}
但我得到了与之前完全相同的String(
仍然缺少最后一个零):
QnB6MkdqZzAxZDdWZkdmRDhaUDFVQT09
有人知道会发生什么吗?
【问题讨论】:
-
您正在使用的 c# 方法可能正在使用 base64-url 编码。有多种 base64 编码类型,base64-url 编码不同于默认的 base64 编码。如果您想使用 base64 编码,请尝试 Java8 中的 Base64 形式的 java.util。
-
另外,
UrlTokenEncode方法对来自常规 base64 编码的符号字符进行了一些映射,因此它们可以安全地用于 url,即它将+替换为-和/替换为_。如果您需要 Java 中的确切功能,则此映射也是必要的。但是,这不适用于您的情况。 -
另外,如果您使用标准的 .NET
Convert.ToBase64String(encbuff)方法,它不会在末尾包含额外的 0,因此与 Java 等效项相同。看起来UrlTokenEncode方法出于某种原因正在添加它。
标签: java c# base64 encode httpserverutility