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\x00@"
127.0.0.1:6379>
我想解析上面的输出字符串(作为一串位,比如“100000000011 ...”)来获取设置位的索引,我该怎么做?
答案 0 :(得分:2)
你知道setbit
只是设置一个字符串的位,所以mykey
持有一个字符串。当您使用命令get mykey
时,它只返回字符串值。
\x00
也是一个字母,你可以参考ASCII TAble。
每个char都有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
来获取char的ascii值,并使用bin来将dec转换为bin,并将0添加到高位,它的长度小于8
输出是:
0100000000000000