Base64解码字节数组 - 来自iOS的APNS令牌

时间:2015-01-02 18:22:17

标签: php ios apple-push-notifications

我收到一个设备令牌,编码为base64“byte”数组。输入如下所示:

J6Kwrh15AqXKiaQminI/Eb/Mtj4nMkPhQYsROhJXmes=

我被告知这是一个base64编码的值,但使用base64_decode解码它会返回:

string(32) "'¢°®y¥Ê‰¤&Šr?¿Ì¶>'2CáA‹:W™ë"

我发现这个脚本应该输出实际的APNS令牌:

$a = base64_decode("J6Kwrh15AqXKiaQminI/Eb/Mtj4nMkPhQYsROhJXmes=");
$b = array();

foreach(str_split($a) as $c)
    $b[] = sprintf("%08b", ord($c));

exit(implode(' ', $b));

但它返回:

00100111 10100010 10110000 10101110 00011101 01111001 00000010 10100101 11001010 10001001 10100100 00100110 10001010 01110010 00111111 00010001 10111111 11001100 10110110 00111110 00100111 00110010 01000011 11100001 01000001 10001011 00010001 00111010 00010010 01010111 10011001 11101011

我期待的是:

c9d4c07c fbbc26d6 ef87a44d 53e16983 1096a5d5 fd825475 56659ddd f715defc

有什么问题?

1 个答案:

答案 0 :(得分:1)

要生成十六进制,您可以使用以下内容:

$a = unpack("H*", base64_decode("J6Kwrh15AqXKiaQminI/Eb/Mtj4nMkPhQYsROhJXmes="));
print_r($a);

$a现在是一个带有十六进制的数组

要包含您可以使用的间距:

$a = unpack("H*hex", base64_decode("J6Kwrh15AqXKiaQminI/Eb/Mtj4nMkPhQYsROhJXmes="));
$b = str_split($a["hex"], 8);
$output = "";
foreach ($b as $current) {
    $output .= "$current ";
}
echo($output);

最后一切都包含在一个函数中:

function base64_decode_apns_token($token) {
    $a = unpack("H*hex", base64_decode($token));
    $b = str_split($a["hex"], 8);
    $output = "";

    foreach ($b as $current) {
        $output .= "$current ";
    }

    return trim($output);
}
相关问题