Функциональный пакет () возвращает 0 - PullRequest
1 голос
/ 06 января 2011

Почему такой код как pack('i',6) может возвращать 0?

Все php.net говорит о возвращаемых значениях этой функции:

Возвращает двоичную строку, содержащую данные.

1 Ответ

9 голосов
/ 06 января 2011

Вы должны быть немного более конкретным здесь. Какой тип возврата? Это двоичная строка, поэтому часто вы видите не то, что на самом деле содержит.

Может начинаться с нескольких нулевых байтов (т. Е. Значение = 0, \0 char). Поскольку этот байт используется для обозначения конца строки в C и других языках, echo и другие функции останавливаются, когда они сталкиваются с нулевым байтом (иногда в руководстве говорится, что функция «бинарно-безопасна», что означает, что она не считает нулевой байт как конец строки).

Также есть много непечатаемых символов. Обычно они имеют какое-то особое значение (например, символ 7 - это команда «bell», введите ее в свою оболочку, чтобы попробовать php -r 'echo "\7";').

Чтобы узнать, что находится в вашей строке, вы можете "преобразовать" каждый символ в его шестнадцатеричное представление. Для этого вы можете использовать bin2hex(), обратите внимание, что для представления одного символа входной строки необходимы два символа.

$ php -r 'var_dump(bin2hex(pack("i",6)));'
string(8) "06000000"

(вывод, который вы видите выше, зависит от вашего оборудования.) В моем случае pack('i', 6); возвращает целое число в формате little-endian , так как у меня есть процессор Intel.

Вы можете видеть, что первый символ (06) имеет десятичное значение 6. Затем вы обычно смотрите, какому символу он принадлежит. Во многих случаях можно использовать таблицу ASCII, но учтите, что в случае использования юникода или любой другой кодировки определенные символы могут иметь другое значение. Согласно моей таблице ASCII, это ACK символ . Это непечатный символ, он имеет только функцию управления.

Остается объяснить, почему это переводится в целое число 0. К счастью, это очень просто. Прочтите страницу руководства PHP по приведению строк к числам .

Если строка начинается с действительного числовые данные, это будет значение используемый. В противном случае значение будет 0 (Ноль). * +1032 *

Поскольку символ \6 не является ни знаком, ни цифрой (символы 0-9 являются десятичными \48 - \57 или \0x30 - \0x39 шестнадцатеричные) PHP возвращает ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...