Мое первое предложение состоит в том, чтобы вы внимательно прочитали документацию.Эта проблема имеет мало общего с Perl и имеет много общего с пониманием того, что ожидает функция.Мое второе предложение - привыкнуть немного нервничать, когда вы копируете какой-то код.Достаточно нервный, чтобы уделять дополнительное внимание к коду, документации и т. Д. По крайней мере, когда клиент / начальник / кто-то спрашивает вас, что делает этот бит скопированного кода, у вас должен быть хороший ответ.
Первый параметр pack () - это строка формата.Это определяет способ форматирования параметров при создании выходных данных.
Из документации для pack ():
Строка формата состоит из следующих кодов форматанеобязательным аргументом повторителя.Аргумент повторителя может быть целочисленным значением или * для повторения до конца входных данных. Для a, A, h, H счетчик повторений указывает, сколько символов одного аргумента данных будет взято, для @ это абсолютная позиция, куда следует поместить следующие данные, для всего остального, повторcount указывает, сколько аргументов данных будет использовано и упаковано в полученную двоичную строку.
Итак, проблема в том, что ваша строка формата не подходит для аргументов, которые вы передаете pack (),Теперь имейте в виду, что я должен угадать строку соответствующего формата для ваших нужд.Вы должны прочитать документацию и определить правильную строку формата.
Следующее работает просто отлично:
echo pack("SSA12ACL",
'25',
'00001',
'2u7wx6fd94fd',
'f',
preg_split('/\./','10.2.1.1', -1, PREG_SPLIT_NO_EMPTY),
'1278761963');
Функция preg_split () возвращает один массив.Тем не менее, «C4» в исходной строке формата может принимать 4 параметра.Исходя из моего подсчета, исходная строка формата подразумевает 9 параметров, а не 6.