2017-09-04 221 views
1
127.0.0.1:6379> setbit mykey 1 1 
(integer) 0 
127.0.0.1:6379> setbit mykey 23 1 
(integer) 0 
127.0.0.1:6379> setbit mykey 345 1 
(integer) 0 
127.0.0.1:6379> get mykey 
"@\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\[email protected]" 
127.0.0.1:6379> 

我想解析上面的输出字符串(比如“100000000011 ...”这样的位串)来获取设置位的索引,我该怎么做?将Redis输出字符串转换为位字符串

回答

2

你知道setbit只是设置一个字符串的位,所以mykey是持有一个字符串。当你使用命令get mykey时,它只是返回字符串值。

而且\x00也是一个字符,你可以参考这个ASCII TAble

每个字符都有8位,位图只是由字符串中每个字符的所有位组成。 其顺序是每8位的顺序是字符串中的字符顺序,并且在此每8位中,位的顺序是从高位到低位。例如,如果字符串是@\x00,那么字符串的长度为2时,比特长度为16的@ ASCII值是十进制64,和\x00的ASCII是0

所以其位图是:

0100 0000 0000 0000 

因此,他们的偏移从0到15从左到右。

如果你有关于这个疑问,您可以执行此命令在Redis的-CLI测试:

setbit test 1 1 
setbit test 15 0 
get test 

这将是@\x00

因此,位图和字符串之间的关系是清楚的,我们可以使用字符串来获取我们想要的位图。

只使用一个简单的Python脚本:

s = "@\x00" 
bitmap = "" 
for c in s: 
    x = ord(c) 
    str = bin(x).split('b')[1] 
    if len(str) < 8 : 
     str = '0' * (8-len(str)) + str 
    bitmap += str 
print bitmap 

在这个脚本,它使用ord获得字符的ASCII值,并用它来斌于DEC转换成仓,并添加0至高位其长度小于8

输出为:

0100000000000000 
+1

尼斯回答 - 我想补充一点的示例脚本是Python化和澄清,@和X00是不一样的字符(?) –