我有一个数组,其中包含代表真值或假值的 1 或 0 值。例如
array(1,0,0,1,0,1,1,1,1);
我想将这个数组压缩/编码成尽可能短的字符串,以便它可以存储在空间受限的地方,例如 cookie。它还需要能够在以后再次解码。我该怎么做?
附言。我在 PHP 工作
最佳答案
这是我的建议:
$a = array(1,0,0,1,0,1,1,1,1,1,0,0,1,0,1,1,1,1,1,0,0,1,0,1,1,1,1);
$compressed = base64_encode(implode('', array_map(function($i) {
return chr(bindec(implode('', $i)));
}, array_chunk($a, 8))));
var_dump($compressed); // string(8) "l8vlBw=="
所以你得到每 8 个字符(实际上是二进制 0..255
),将它们转换为整数,表示为 ASCII 字符,将其分解为字符串并转换为 base64能够将其保存为字符串。
更新:
相反的很简单:
$original = str_split(implode('', array_map(function($i) {
return decbin(ord($i));
}, str_split(base64_decode($compressed)))));
我到底是怎么写的(以防万一有人对如何编写这种不可读且几乎无法维护的代码感兴趣):
我已经编写了 $original = $compressed;
并开始逐步反转此表达式的正确部分:
- 从base64解码为二进制字符串
- 拆分成一个数组
- 将每个字符转换为 ASCII 码
- 将十进制ASCII码转换为二进制
- 将所有二进制数合并为一个数
- 将长二进制字符串拆分为数组
关于PHP将位数组压缩为可能的最短字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15023213/