2013-08-21 4 views
4

Я хотел бы знать, как я могу отменить то, что это unpack функция ниже. Я думаю, что функция pack может отменить то, что было сделано unpack, однако я не уверен.Возврат распаковки ('C *', "string")

Сначала у меня есть простая строка, которая после распаковки у меня будет массив байтов, представляющий такую ​​строку. Теперь я хотел бы знать, как отменить такой массив обратно на исходную строку.

<?php 
$array = unpack('C*', "odd string"); 
/*Output: Array 
(
    [1] => 111 
    [2] => 100 
    [3] => 100 
    [4] => 32 
    [5] => 115 
    [6] => 116 
    [7] => 114 
    [8] => 105 
    [9] => 110 
    [10] => 103 
)*/ 

$string = pack("which format here?", $array); 

echo $string; 
#Desired Output: odd string 
?> 

спасибо.

ответ

10

Вы должны использовать call_user_func_array вернуться unpack('C*', “string”), как это:

call_user_func_array('pack', array_merge(array('C*'), $array))) 
+0

Я видел 'call_user_func_array()' для упаковки и распаковки, но больше не помнил его. Спасибо. –

+0

Можете ли вы, пожалуйста, прояснить решение в терминах 'unpack', но не в терминах array_merge? – Jacobian

+0

О, я вижу, как это работает. – Jacobian

3

Когда вы на PHP 5.6, следует рассмотреть возможность использования argument unpacking, как это примерно от 4 до 5 раз быстрее, чем при использовании call_user_func_array:

pack('C*', ...$array); 

И когда вы на PHP 5.5 или ниже, следует рассмотреть возможность использования ReflectionFunction, который, кажется, немного быстрее, чем call_user_func_array:

$packFunction = new ReflectionFunction('pack'); 
$packFunction->invokeArgs(array_merge(array('C*'), $array)); 
Смежные вопросы