2012-06-30 4 views
1

Я использую FMS вместе с PHP, и мне нужен идентификатор клиента, чтобы в какой-то момент отключить некоторых пользователей. Таким образом, я извлекаю идентификатор клиента из FMS, но FMS отправляет идентификатор в виде длинного int, например 4702111234508538223.Преобразование long int в строку в PHP

Вот моя проблема; Мне нужно преобразовать это число в oAACAAAA в PHP. Есть ли какой-нибудь короткий путь или какая-то библиотека для этого? В противном случае мне нужно преобразовать this AS3 library в PHP.

+0

@Jared Вы не случилось бы знать как PHP хранит его целые типы внутри? – Bojangles

+0

@JamWaffles - Извините, не могу говорить; нога во рту. Моя мысль заключалась в том, что не было никакого решения для этого, но я нахожу что-то другое, похоже, так. –

+0

Я вижу, что проблема заключается в том, что Adobe имеет кирпичи между ушами. Как они туда попали? –

ответ

2

Эта функция преобразует что-то вроде "4702111234525315439" в нечто вроде "oAADAAAA":

function convert_id_to_str($id) 
{ 
    if (strspn($id, '') != strlen($id)) { 
     return false; 
    } 
    $str = ''; 
    if (PHP_INT_SIZE >= 8) { 
     while ($id) { 
     $str .= chr($id & 255); 
     $id >>= 8; 
     } 
    } else { 
     while ($id) { 
     $str .= chr(bcmod($id, '256')); 
     $id =  bcdiv($id, '256', 0); 
     } 
    } 
    return $str; 
} 
2

Вы можете использовать либо BC Math или GMP PHP функциональные возможности, чтобы быть уверенным, чтобы обрабатывать 64-битное число на 32 и 64-битном PHP, способным сервером, а затем pack результат в форматированной строке, например :

$id = "4702111234508538223"; 

$hi = bcdiv($id, pow(2, 32)); 
$lo = bcsub($id, bcmul($hi, pow(2, 32))); 

var_dump(pack("LL", $lo, $hi)); 

Возвращает string(8) "oAACAAAA". Код взорвался, но его можно было легко превратить в однострочный или функцию. Использование расширения большого числа обеспечивают совместимость с 32-битными платформами, но если вы уверены, что платформа хостинг для вашего PHP-интерпретатора имеют 64-разрядные возможности вы могли бы просто использовать

pack("LL", $id, $id/pow(2, 32));