bin2hex 的意义是什么?
虽然知道bin2hex
的执行结果,但一直没能准确的理解它的意义和使用场景,bin2hex("hello world")
转成 16进制表示的字符串后,长度还增加了,本来11byte
,转换后 11 * 2
变成 22byte
68656c6c6f20776f726c64
,传输量还增加了,意义是什么呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
根据
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进制表示的。一位十六进制可以表示4bit二进制,表示11个字节的二进制需要88bit,十六进制需要88/4=22bit,十六进制占用的位数更少,表述更简洁
二者转换为字节时,由于十六进制两位表示一字节,hello world是二进制字符串,所以转换为十六进制后,看起来字符串更长了,但在计算机的内部表示中,十六进制可以使用更少的位数来表述较长的二进制位
二者在内存占用上是一样的,区别仅在表示法
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"
得到我们的源数据,这样通过打包和解包,我们成功将数据的传输量减少了一半。