Java Base64 Encode函数与PHP Base64 Encode函数相同吗?

时间:2019-09-10 00:56:58

标签: java php base64

我正在尝试使用客户端提供的值在PHP中测试Soap Security标头。

他们正在提供类似...的价值

wTAmCL9tmg6KNpeAQOYubw==

...并说这是Base64编码的值。

但是,当我通过PHP的Base64解码功能运行它时...

base64_decode("wTAmCL9tmg6KNpeAQOYubw==");

它将其翻译为:�0&�m6@�.o

如果我用Java解码...

import java.util.Base64;
import java.util.Arrays;

/**
 * hello
 */
public class hello {

    public static void main(String[] args) {
        Base64.Decoder decoder = Base64.getDecoder();
        Base64.Encoder encoder = Base64.getEncoder();
        String stringEncoded = "wTAmCL9tmg6KNpeAQOYubw==";

        System.out.println("This is a decoded value: " + decoder.decode(stringEncoded));
        System.out.println("This is a re-coded value: " + encoder.encode(decoder.decode(stringEncoded)));

    }
}

我得到一个这样的解码字符串:[B@7229724f

但是如果我尝试重新编码该字符串,则会得到以下信息:[B@4c873330

我在这里想念什么?

2 个答案:

答案 0 :(得分:0)

您缺少的是,对Base 64值进行解码的结果不打算打印为字符串。实际上,您在Java println的输出中看到了这一点。 [B @ 7229724f不是解码字节的字符串表示形式。这是Java字节[]的打印方式。 [B表示字节数组,其余字符是对象标识的十六进制数字。 (它将为每个字节数组实例打印不同的内容,并且与数组的内容无关。)

如果您想要字节的字符串表示形式,则需要从字节中构造一个字符串:

    System.out.println("This is a decoded value: " + new String(decoder.decode(stringEncoded), StandardCharsets.UTF_8));
    System.out.println("This is a re-coded value: " + new String(encoder.encode(decoder.decode(stringEncoded), StandardCharsets.UTF_8));

答案 1 :(得分:0)

基于此answer,如何指定编码。推荐的编码为UTF-8。