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...”)以获取设置位的索引,我该怎么做?
最佳答案
您知道setbit
只是设置字符串的位,因此mykey
保存着一个字符串。当您使用命令get mykey
时,它只返回字符串值。
而\x00
也是一个字符,你可以引用这个ASCII TAble .
每个字符有八位,位图由字符串中每个字符的所有位组成。 它的顺序是每8位的顺序就是字符串中char的顺序,而这每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值,使用to bin将dec转换为bin,长度小于8时在高位加0
输出是:
0100000000000000
关于string - 将 Redis 输出字符串转换为位字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46032681/