登录
首页 >  Golang >  Go问答

匹配序列化字符串

来源:stackoverflow

时间:2024-04-27 19:36:54 425浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《匹配序列化字符串》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

我收到这个字符串 "\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80J\x13\x80SQ\x80L\xe0\x80@\x92\x80L?来自函数的 \x80H\xe0" (在 redis 位图上运行 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"))
}

Playground link

正则表达式并不是最好的解决方案。编写一个简单的 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

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《匹配序列化字符串》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>