这个问题在这里已有答案:
我从一个函数(在redis位图上运行"\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80J\x13\x80SQ\x80L\xe0\x80@\x92\x80L?\x80H\xe0"
命令并给我序列化字符串)接收此字符串GET
但由于转义序列,我无法匹配这种模式。有人可以告诉我与这种字符串匹配的正则表达式序列吗?
首先,我试图找出如何以直接的二进制形式从Redis获取相同的数据(如[]byte
);其余的将更简单。
但是为了处理现有形式的这些东西,我首先将输入字符串规范化 - 用等效字节替换所有那些反斜杠转义的十六进制编码字符。
这样可以轻松搜索这些字节的确切值 - 可能使用模式中的反斜杠转义十六进制编码字符:
包主
import (
"fmt"
"strconv"
"strings"
)
func main() {
s := "\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80J\x13\x80SQ\x80L\xe0\x80@\x92\x80L?\x80H\xe0"
s, err := strconv.Unquote(`"` + s + `"`)
if err != nil {
panic(err)
}
fmt.Println(strings.Index(s, "\x80SQ\x80L"))
}
An introduction to Redis data types and abstractions
位图
位图不是实际的数据类型,而是在String类型上定义的一组面向位的操作。
正则表达式不是最佳解决方案。编写一个简单的Go函数来进行转换。例如,
package main
import (
"fmt"
"strconv"
)
func redisBits(s string) (string, error) {
s, err := strconv.Unquote(`"` + s + `"`)
if err != nil {
return "", err
}
return s, nil
}
func main() {
s := "\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80J\x13\x80SQ\x80L\xe0\x80@\x92\x80L?\x80H\xe0"
fmt.Printf("%x\n", s)
b, err := redisBits(s)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("%x\n", b)
}
游乐场:https://play.golang.org/p/rbE9iG3tOTx
输出:
0100000000000000000000804a13805351804ce0804092804c3f8048e0
0100000000000000000000804a13805351804ce0804092804c3f8048e0