为什么这样的代码可以pack('i',6)
返回0?
所有 php.net 都提到了这个函数的返回值:
返回包含数据的二进制字符串。
你必须在这里更具体一点。返回类型是什么?它是一个二进制字符串,所以你看到的往往不是它实际包含的。
它可以从几个空字节开始(即 value=0, \0
char)。由于此字节用于表示 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(零)。
由于\6
char 既不是符号也不是数字(字符 0-9 是十进制\48
-\57
或\0x30
-\0x39
十六进制)PHP 返回零。