2017-09-04 130 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也是一個字符,你可以參考這個ASCII TAble

每個字符都有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獲得字符的ASCII值,並用它來斌於DEC轉換成倉,並添加0至高位其長度小於8

輸出爲:

0100000000000000 
+1

尼斯回答 - 我想補充一點的示例腳本是Python化和澄清,@和X00是不一樣的字符(?) –