用于Android的PHP/Java之间的数据编码/解码


Encoding/decoding of data between PHP/Java for Android

我必须解码从PHP服务器接收到的base64编码数据。

服务器使用'base64_encode'对数据进行编码。

在我的Android应用中,我使用Android .utils。Base64类来进行解码。

原始加密数据= "†+Ü]M(‡=ñö"
PHP中的Base64编码数据给出- "hisP3F1NBCgIAocQCD3x9g=="
Base64编码数据在Android给出- "4oCgKw/DnF1NBCgIAuKAoRAIPcOxw7Y="

可以看到,Java编码的字符串比PHP编码的字符串长。我需要找出它们的默认编码格式。

如何从两者获得相同的编码字符串?

Java/Android代码:
String encrypted = "†+Ü]M(‡=ñö";
byte[] encoded = Base64.encode(encrypted.getBytes(), Base64.DEFAULT);
String str = new String(encoded); //str = "4oCgKw/DnF1NBCgIAuKAoRAIPcOxw7Y="  

在Java中试试:这会给你字符串的长版本(UTF-8)

byte[] encoded = Base64.encode(encrypted.getBytes("UTF-8"), Base64.DEFAULT);
String str = new String(encoded, "UTF-8");

更新:

在Java中试试这个:这会给你字符串的简短版本(CP1252)

// This should give the same results as in PHP
byte[] encoded = Base64.encode(encrypted.getBytes("CP1252"), Base64.DEFAULT);
String str = new String(encoded, "CP1252");

或者试试这个PHP脚本:

文件:test.php

<?php
echo base64_encode($_GET['str'])." Default UTF-8 version<br />";
echo base64_encode(iconv("UTF-8","CP1252",$_GET['str']))." CP1252 Version <br />";
?>
usage: http://[SOMEDOMAIN]/test.php?str=†+Ü]M(‡=ñö

对于我来说,CP1252没有工作,因为它无法使用非字母数字符号。我发现最好的字符集是ISO-8859-1,使用方法如下:

Base64.getEncoder()
                .encodeToString(
                    stringToBeEncoded.getBytes(
                        Charset.forName("ISO-8859-1")))

我用了这个:

private String decodeBase64(String encrypted) {
    byte[] encoded = new byte[0];
    try {
        encoded = Base64.getDecoder().decode(encrypted.getBytes("CP1252"));
        String str = new String(encoded, "CP1252");
        return str;
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return "";
}