Я получаю токен устройства, закодированный как base64 «байтовый» массив. Вход выглядит так:
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);
}
Других решений пока нет …