1

为什么这样的代码可以pack('i',6)返回0?

所有 php.net 都提到了这个函数的返回值:

返回包含数据的二进制字符串。

4

1 回答 1

9

你必须在这里更具体一点。返回类型是什么?它是一个二进制字符串,所以你看到的往往不是它实际包含的。

它可以从几个空字节开始(即 value=0, \0char)。由于此字节用于表示 C 和其他语言中的字符串结尾,echo并且其他函数在遇到空字节时停止(有时手册说函数是“二进制安全”的,这意味着它不会将空字节视为字符串结尾)。

还有很多不可打印的字符。它们通常具有某种特殊含义(例如,字符 7 是“bell”命令,将其输入到您的 shell 中进行尝试php -r 'echo "\7";')。

要找出字符串中的内容,您可以将每个字符“转换”为其十六进制表示。您可以使用bin2hex()它,注意它需要两个字符来表示输入字符串的一个字符。

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

(您在上面看到的输出取决于您的硬件。)在我的例子中,返回小端pack('i', 6);格式的整数,因为我有一个英特尔处理器。

您可以看到第一个字符 ( 06) 的十进制值为 6。然后您通常要做的就是查找它属于哪个字符。在许多情况下,可以使用 ASCII 表,但请注意,如果您使用 unicode 或任何其他编码,某些字符可能具有其他含义。根据我的 ASCII 表,它是ACK字符。它是一个不可打印的字符,它只有控制功能。

还有待解释的是为什么这会转换为整数 0。幸运的是,这很容易。阅读有关将字符串转换为数字的 PHP 手册页。

如果字符串以有效的数字数据开头,这将是使用的值。否则,该值将为 0(零)。

由于\6char 既不是符号也不是数字(字符 0-9 是十进制\48-\57\0x30-\0x39十六进制)PHP 返回零。

于 2011-01-06T13:38:51.790 回答