Base 64 decode + encode产生不同的结果

时间:2018-04-03 23:59:01

标签: java base64

我给了一个base64字符串(我无法控制我给出的字符串):     PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzYW1scDpSZXNwb25zZSB4bWxuczpzYW1scD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIg==

当我解码它时,在Java中,它产生:

<?xml version="1.0"?>
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" 

当我对base64进行编码时(再次,在Java中),它产生:

PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCI=

这些字符串不同,但它们应该相同。

在我搜索过程中,我偶然发现了这个网站:https://www.base64encode.org

在这个网站上,如果我点击编码按钮,我得到的结果与我的java base64编码相同。

但是,如果不是点击编码按钮,我点击“实时模式开启”按钮,我得到了我收到的原始base64编码字符串 - 这正是我想要的!

知道如何在我自己的代码中实现这些相同的结果吗?

public String getEncodedSAMLMessage(String message) {
    byte[] byteMessage;
    try {
        byteMessage = message.getBytes("UTF-8");
        String base64Encoded = helpers.base64Encode(byteMessage);
        return URLEncoder.encode(base64Encoded, "UTF-8");
    } catch (UnsupportedEncodingException e1) {
    }
    return null;
}

public String getDecodedSAMLMessage(String message) {
    String urlDecoded = helpers.urlDecode(message);
    byte[] base64Decoded = helpers.base64Decode(urlDecoded);
    try {
        return new String(base64Decoded, "UTF-8");
    } catch (UnsupportedEncodingException e) {
    }
    return null;
}

1 个答案:

答案 0 :(得分:0)

尝试使用Apache Commons Codec。

import org.apache.commons.codec.Charsets;
import org.apache.commons.codec.binary.Base64;  

public class Base64Encoder {

    private Base64 b64 = new Base64();

    public String encode(String message) {
        return b64.encodeAsString(message.getBytes());
    }

    public String decode(String message) {
        return new String(b64.decode(message), Charsets.UTF_8);
    }
}