Основная проблема здесь (если я правильно понимаю) заключается в том, что вы используете числа PHP для представления байтового массива, однако unpack
требует ввода строки. Если вы сохраняете массив как есть, тогда PHP, кажется, просто конвертирует числа в строки, что означает, что 101 будет «101», что, в свою очередь, составляет 3 байта, что разбивает все на части.
Вам необходимо сначала преобразовать числа в байты. Байт по сути представляет собой unsigned char
, поэтому вы можете сначала упаковать массив в неподписанные символы, а затем распаковать их:
$bytes = [101,102,54,55,99,55,56,49];
$unpacked = unpack("J", pack('C*', ...$bytes));
echo current($unpacked);
Объяснение:
C
- это код пакета для беззнакового символа, а *
указывает, что вам нужно использовать все записи массива. Это сгенерирует строку символов на основе массива. Затем вы можете распаковать эту строку, используя J
(если вы точно знаете, что байты были сгенерированы в порядке байтов с прямым порядком байтов) или P
, если вы знаете, что байты были сгенерированы в порядке с прямым порядком байтов, или Q
, если вы хочу использовать машинный заказ. Если бы байты были сгенерированы на той же машине, тогда Q
, вероятно, был бы лучшим выбором, чем J
, иначе вам нужно знать порядок байтов.
Пример: http://sandbox.onlinephpfunctions.com/code/5cba2c29522f7b9f9a0748b99fac768012e759ce
Примечание: это мое личное понимание того, что происходит, поэтому любой, кто лучше разбирается в упаковке / распаковке, может сообщить мне, если я что-то не так понял.