考虑到硬件存储的内存空间不是很理想,所有在做硬件开发的过程中尽量做压缩存储。今天介绍的是时间的压缩,例如:2028-08-29,可能我们在存储的时候需要用10位int类型去存它的时间戳,但是今天我想用4位string去存。没错,我就是压缩成2个字节16进制的字符串,而2028-08-29对应的就是‘3CD8’。
当然做这个压缩我们是有字节的规则的,下面是我们的时间压缩规则
两个字节,16个bit。年用5个bit,放在第一个字节后5位;月用4个bit,放在第二个字节最后4位;日用4个bit,放在第二个字节前4位。也行说到这,你也很疑惑。2028年4位数的年,可以用5个bit表示吗?没错,4位数的年2028确实不能用5个bit表示,但是我们之前就说了,做这个时间压缩我们用自己的规则,那就是年我们自取后两位,像2028我们自取28,5个bit最大为31,我想说2031年这个软件也应该升级了吧。
下面说下这个压缩规则吧,年用'&'表示、月用'o表示、日用'*'表示。年放在第一个字节后5位,月放在第二个字节后4位,日的第一位放在第一个字节的第一位,后四位放在第二个字节的前四位。下面看下具体的转换过程。
10进制:28 -- 2进制:00011100
10进制:08 -- 2进制:00001000
10进制:29 -- 2进制:00011101
那么按照上面的规则,就可以得到:00111100 11011000
那么这个两个字节对应16进制分别为:
2进制:00111100 -- 16进制:3C
2进制:11011000 -- 16进制:D8
所有得到两个字节分别是3CD8,再看下用代码怎么实现
<?php $y=28;//年 $m=8;//月 $d=29;//日 $a1=($d&16)<<1; $a2=$y&31; $a=$a1|$a2; $b1=($d&15)<<4; $b2=$m&15; $b=$b1|$b2; var_dump($a); var_dump($b); $aa=dechex($a);//10进制转16进制 $bb=dechex($b); var_dump($aa); var_dump($bb); ?> 运行结果: int(60) int(216) string(2) "3c" string(2) "d8"