将Redis输出字符串转换为位字符串

时间:2017-09-04 08:00:59

标签: string redis hex

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 ...”)来获取设置位的索引,我该怎么做?

1 个答案:

答案 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