PHP将位数组压缩为可能的最短字符串

标签 php arrays encoding compression

我有一个数组,其中包含代表真值或假值的 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; 并开始逐步反转此表达式的正确部分:

  1. 从base64解码为二进制字符串
  2. 拆分成一个数组
  3. 将每个字符转换为 ASCII 码
  4. 将十进制ASCII码转换为二进制
  5. 将所有二进制数合并为一个数
  6. 将长二进制字符串拆分为数组

关于PHP将位数组压缩为可能的最短字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15023213/

相关文章:

java - 如何将编码密码从服务器发送到电子邮件

php - 将多个复选框插入数据库列

php - 当表格在 Firefox 中跨越多个页面时,不打印单元格边框(第一页除外)

php - Json_encode 或删除最后一个逗号?

c - 使用字符串数组的排序函数 - C 中的错误

php - 将数组键设置为另一个数组值的值 - PHP

php - 不同浏览器中 $_GET 参数的变音问题 (PHP)

javascript - 根据文件扩展名显示文件图标

javascript - 如何在javascript中保留数组?

python - 短 rot13 函数 - Python