2017-09-04 3 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> 

Je souhaite analyser la chaîne de sortie ci-dessus (sous la forme d'une chaîne de bits, comme "100000000011 ...") pour obtenir les index des bits définis, comment le ferais-je? ?Conversion de la chaîne de sortie Redis en chaîne de bits

Répondre

2

Vous connaissez le setbit est juste mis le bit d'une chaîne, de sorte que le mykey tient une chaîne. Lorsque vous utilisez la commande get mykey, il renvoie simplement la valeur de chaîne. Le \x00 est également un caractère.

Chaque caractère a huit bits, et le bitmap est simplement composé de tous les bits de chaque caractère de la chaîne. son ordre est que chaque ordre de 8 bits est l'ordre char dans la chaîne, et dans tous les 8 bits, l'ordre du bit est du bit haut au bit bas. par exemple, si la chaîne est @\x00, alors la longueur de la chaîne est égal à 2, la longueur de bits est de 16. La valeur ASCII de @ est 64 en décimal, et le ascii de \x00 est 0.

Ainsi son bitmap est:

0100 0000 0000 0000 

Donc leurs décalages vont de 0 à 15 de gauche à droite.

Si vous avez un doute à ce sujet, vous pouvez exécuter des commandes dans ce Redis-cli à tester:

setbit test 1 1 
setbit test 15 0 
get test 

Il sera @\x00. Donc, la relation entre le bitmap et la chaîne est claire, nous pourrions utiliser la chaîne pour obtenir le bitmap que nous voulons.

il suffit d'utiliser un simple script 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 

Dans ce script, il utilise le ord pour obtenir la valeur ascii de char, et utiliser pour bac pour convertir le rabattant pour bin et ajouter 0 à bit élevé il est plus petit que la longueur 8

la sortie est:

0100000000000000 
+1

Belle réponse - je n'ajouter que l'exemple de script est Pythonic et préciser que @ et x00 ne sont pas le même caractère (?) –