bindec($value)与hexdec(bin2hex($value))差异及返回结果不符原因咨询
为什么bindec($value)返回0,而hexdec(bin2hex($value))得到86400?
嗨,我来帮你把这个问题的核心差异讲明白~其实问题的根源是你混淆了二进制数据(字节串)和二进制数字的字符串表示,再加上两个函数的工作逻辑完全不同,才出现了这样的结果。
先搞懂两个函数的本质区别
1. bindec():只认「0/1组成的字符串」
bindec()的作用是把字符串形式的二进制数字转换成十进制,它要求传入的参数必须是由0和1字符组成的字符串(比如"101011")。
但你的$value是原始二进制字节串(对应十六进制015180的话,它的实际字节是0x01、0x51、0x80),这些字节对应的ASCII字符根本不是0或1。当你把这个字节串传给bindec()时,它会从左到右扫描字符串,一旦遇到非0/1的字符就停止解析——如果前面没有有效二进制字符,就直接返回0,这就是你得到0的原因。
2. hexdec(bin2hex($value)):正确解析原始二进制数据
这个组合的逻辑是完全契合原始二进制数据的:
bin2hex()的作用是把原始二进制字节串转换成对应的十六进制字符串,比如你的$value转成'015180',这是人类可读的十六进制表示。hexdec()则是把十六进制字符串转换成十进制数字,计算过程是:
这自然就得到了正确的结果。0*16^5 + 1*16^4 +5*16^3 +1*16^2 +8*16^1 +0*16^0 = 0 + 65536 +20480 +256 +128 = 86400
你遗漏的关键知识点
- 千万不要把二进制字节串(计算机存储的原始数据,比如文件内容、网络传输的字节)和二进制数字字符串(比如
"1100"这种用来表示数字的字符序列)搞混!这是两个完全不同的东西。 - 如果要把二进制字节串转换成十进制数字,正确的路径是:先把字节串转成十六进制/八进制的可读字符串,再用对应的转换函数(比如
hexdec());或者用unpack()函数直接解析字节对应的数值(比如unpack('N', $value),不过要注意字节序的问题)。
内容的提问来源于stack exchange,提问作者BMErEr
相关产品推荐
相关产品推荐

