为什么pack('i',6)
这样的代码会返回0?
所有php.net都说明了这个函数的返回值:
返回包含的二进制字符串 数据
答案 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返回零。