考虑到硬件存储的内存空间不是很理想,所有在做硬件开发的过程中尽量做压缩存储。今天介绍的是时间的压缩,例如: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"