虽然知道bin2hex
的执行结果,但一直没能准确的理解它的意义和使用场景,bin2hex("hello world")
转成 16进制表示的字符串后,长度还增加了,本来11byte
,转换后 11 * 2
变成 22byte
68656c6c6f20776f726c64
,传输量还增加了,意义是什么呢?
虽然知道bin2hex
的执行结果,但一直没能准确的理解它的意义和使用场景,bin2hex("hello world")
转成 16进制表示的字符串后,长度还增加了,本来11byte
,转换后 11 * 2
变成 22byte
68656c6c6f20776f726c64
,传输量还增加了,意义是什么呢?
一位十六进制可以表示4bit二进制,表示11个字节的二进制需要88bit,十六进制需要88/4=22bit,十六进制占用的位数更少,表述更简洁
二者转换为字节时,由于十六进制两位表示一字节,hello world是二进制字符串,所以转换为十六进制后,看起来字符串更长了,但在计算机的内部表示中,十六进制可以使用更少的位数来表述较长的二进制位
二者在内存占用上是一样的,区别仅在表示法
var_dump(dechex(10));
var_dump(decbin(10));
hex.php:3:string 'a' (length=1)
hex.php:4:string '1010' (length=4)
bin2hex
将数据以2进制流的方式进行处理,转为2进制流
对应的16进制
的字符串
,这样处理肯定会增加数据量,比如"h"
的二进制bit流是0011 0110
,十六进制表示为 0x68
,再转为字符串返回的话是"68"
需要占用 2bytes
。
但如果反过来,我们的源数据是"68" 2bytes
的字符串,打包至2进制
的话就是 "h" 1bytes
,这样就相当于压缩
了数据,结合 pack/unpack
更好理解我这里用的压缩
,hex2bin($hex_string) = pack("H*", $hex_string)
。所以要灵活的理解谁是源数据,谁是压缩后传输的数据。
如果你的数据里的字符都落在0-9a-f
这16
个内,可以作为十六进制的字符串
,则可以使用hex2bin
压缩数据,接收端再使用bin2hex
解包数据,减少了传输的数据量。
比如我们有一段待传输的数据 "68656c6c6f"
,10byte
,打包转为二进制流的话可以将 "68" "65" "6c" "6c" "6f"
处理为 "h" "e" "l" "l" "o"
,只需要5bytes
,传输完成后再使用bin2hex
既可以将 "hello"
解包为 "68656c6c6f"
得到我们的源数据,这样通过打包和解包,我们成功将数据的传输量减少了一半。
2 回答1.5k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
2 回答862 阅读✓ 已解决
1 回答1k 阅读✓ 已解决
2 回答920 阅读
1 回答883 阅读
1 回答903 阅读
根据
bin2hex ( string $str ) : string
的定义,传入参数和返回参数都是string
格式,传入参数为"hello world"
类型string
,是11个byte
的长度,换成2进制为11*8=88bits
,转换之后按16进制表示,则长度为88/4=22
个hex
,但最后又转成string
类型,所以从hex
到string
就从22个hex(4bits)
扩充到了22个byte(8bits)
。其实2进制和16进制是等价的,4位2进制就是1位16进制,楼主问binhex
的意义就是在考虑进制转换的意义,二进制当然有意义,计算机就是根据二进制来设计的(门电路),16进制能够更方便地表示二进制,比如内存地址就是用16进制表示的。