bin2hex 的意义是什么?

发布于 2022-09-11 20:16:12 字数 235 浏览 16 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

メ斷腸人バ 2022-09-18 20:16:12

根据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进制表示的。

夜司空 2022-09-18 20:16:12

一位十六进制可以表示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)
巨坚强 2022-09-18 20:16:12

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"得到我们的源数据,这样通过打包和解包,我们成功将数据的传输量减少了一半。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文