2017-09-04 28 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もcharです。ASCII TAbleを参照してください。

すべてのcharは8ビットで、ビットマップは文字列のすべての文字のすべてのビットで構成されています。 の順番は、8ビットの次数が文字列内のcharの順番であり、この8ビットごとにビットの順番が上位ビットから下位ビットまでです。ストリングが@\x00である場合、文字列の長さが2である、例えば、ビット長が@の16のASCII値は10進数で64であり、そして\x00のASCIIが0

であるように、そのビットマップです。

0100 0000 0000 0000 

したがって、オフセットは左から右に0から15までです。

あなたはこのことについて疑問を持っている場合は、これはRedisの-cliのテストにしてコマンドを実行できます。

setbit test 1 1 
setbit test 15 0 
get test 

それは@\x00になりますが。

ビットマップと文字列の関係が明確であるため、文字列を使用して必要なビットマップを取得できます。 、それは、文字のASCII値を取得するためにordを使用しています。このスクリプトでは

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 

ビンに12月を変換するために、ビンに使用し、高ビットに0を追加します。

は単純なPythonスクリプトを使用します私は唯一のサンプルスクリプトがあることを追加するPython的およびその@とX00を明確に同じ文字ではありません -

0100000000000000 
+1

ニースの答え(?):長さが出力される8

よりも小さくなっています –

関連する問題