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

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

最佳答案

您知道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/

相关文章:

node.js - 使用 Redis 和 MongoDB (HyperLogLog) 计算唯一值

java - Ascii 到 Hex 转换错误

c# - 将 C++ 字符串/wchar_t* 转换为 C# 字符串?

powershell - Redis 集群健康检查命令

redis - 当 redis 更新时,redis 会将更新发送到我的 grpc 服务器。如何实现

将 2 字节十六进制数转换回十进制

visual-studio - 如何从 Visual Studio 二进制编辑器复制十六进制?

python - re.sub() - 用于替换字符串中最后一次出现的子字符串的正则表达式

java - 如何读取输入文本? java

java - 将编码为字节数组的字符串转换为字符数组,而不使用 java.lang.String