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

Base64 decode byte array - APNS token from iOS

我收到一个设备令牌,编码为 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

怎么了?

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

$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);
}