Function pack()返回0

时间:2011-01-06 13:01:16

标签: php pack

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

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

  

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

1 个答案:

答案 0 :(得分:9)

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

它可以从几个空字节开始(即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);little-endian格式返回整数,因为我有一个英特尔处理器。

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

还有待解释的是为什么这会转换为整数0.幸运的是,这很容易。阅读casting strings to numbers上的PHP手册页。

  

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

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