Function pack()返回0

Ser*_*gey 1 php pack

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

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

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

sve*_*ens 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"
Run Code Online (Sandbox Code Playgroud)

(您在上面看到的输出取决于您的硬件.)在我的情况下pack('i', 6);,以little-endian格式返回整数,因为我有一个Intel处理器.

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

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

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

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