mis*_*t92 3 php bitmap bitset redis
我使用redis位图来记录一年中的用户操作,如果用户在一年中的第一天登录,我会将密钥的第一位设置为1. redis值如下:
key:user.18.action(18是用户id)
值:(位图)000100000000000000000000 ...(约365位长)
但当我试图获得价值时,GET user.18.action返回"\x10".
在PHP中,如何将这些字符串转换为该字符串000100000000000000000000...?
实际上,我使用下面的代码来实现它,但这样可以吗?并且有更好的解决方案吗?
$bitmap = $this->redis->get('user.18.action');
$binstrlen = strlen($bitmap);
$hex = bin2hex($bitmap);
$str = str_baseconvert($hex, 16, 2);
var_dump(str_pad($str, $binstrlen * 8, '0', STR_PAD_LEFT));
function str_baseconvert($str, $frombase=10, $tobase=36) {
$str = trim($str);
if (intval($frombase) != 10) {
$len = strlen($str);
$q = 0;
for ($i=0; $i<$len; $i++) {
$r = base_convert($str[$i], $frombase, 10);
$q = bcadd(bcmul($q, $frombase), $r);
}
}
else $q = $str;
if (intval($tobase) != 10) {
$s = '';
while (bccomp($q, '0', 0) > 0) {
$r = intval(bcmod($q, $tobase));
$s = base_convert($r, 10, $tobase) . $s;
$q = bcdiv($q, $tobase, 0);
}
}
else $s = $q;
return $s;
}
Run Code Online (Sandbox Code Playgroud)
function bitmap_human($bitmap){
$bytes = unpack('C*', $bitmap);
$bin = join(array_map(function($byte){
return sprintf("%08b", $byte);
}, $bytes));
return $bin;
}
Run Code Online (Sandbox Code Playgroud)
我想出来了,可以正常工作.
| 归档时间: |
|
| 查看次数: |
718 次 |
| 最近记录: |