bin2hex 的意义是什么?

big_cat
  • 1.6k

虽然知道bin2hex的执行结果,但一直没能准确的理解它的意义和使用场景,bin2hex("hello world") 转成 16进制表示的字符串后,长度还增加了,本来11byte,转换后 11 * 2 变成 22byte 68656c6c6f20776f726c64,传输量还增加了,意义是什么呢?

回复
阅读 3.3k
3 个回答

根据bin2hex ( string $str ) : string的定义,传入参数和返回参数都是string格式,传入参数为"hello world"类型string,是11个byte的长度,换成2进制为11*8=88bits,转换之后按16进制表示,则长度为88/4=22hex,但最后又转成string类型,所以从hexstring就从22个hex(4bits)扩充到了22个byte(8bits)。其实2进制和16进制是等价的,4位2进制就是1位16进制,楼主问binhex的意义就是在考虑进制转换的意义,二进制当然有意义,计算机就是根据二进制来设计的(门电路),16进制能够更方便地表示二进制,比如内存地址就是用16进制表示的。

Mkless
  • 3.3k

一位十六进制可以表示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)
big_cat
  • 1.6k

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-f16个内,可以作为十六进制的字符串,则可以使用hex2bin压缩数据,接收端再使用bin2hex解包数据,减少了传输的数据量。

比如我们有一段待传输的数据 "68656c6c6f"10byte,打包转为二进制流的话可以将 "68" "65" "6c" "6c" "6f" 处理为 "h" "e" "l" "l" "o",只需要5bytes,传输完成后再使用bin2hex既可以将 "hello" 解包为 "68656c6c6f"得到我们的源数据,这样通过打包和解包,我们成功将数据的传输量减少了一半。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏