1

我有一个带有 s 的文本转储文件,string如下所示:

x\x9cK\xb42\xb5\xaa.\xb6\xb2\xb0R\xcaK-\x09J\xccKOU

我需要将它们转换为[]byte.

有人可以建议如何在 Go 中做到这一点吗?等效的
是。pythondecode('string_escape')

4

2 回答 2

3

这是一种方法。请注意,这不是对 pythonstring_escape格式的完整解码,但考虑到您给出的示例,可能就足够了。

游乐场链接

package main

import (
    "fmt"
    "log"
    "regexp"
    "strconv"
)

func main() {
    b := []byte(`x\x9cK\xb42\xb5\xaa.\xb6\xb2\xb0R\xcaK-\x09J\xccKOU`)
    re := regexp.MustCompile(`\\x([0-9a-fA-F]{2})`)
    r := re.ReplaceAllFunc(b, func(in []byte) []byte {
        i, err := strconv.ParseInt(string(in[2:]), 16, 64)
        if err != nil {
            log.Fatalf("Failed to convert hex: %s", err)
        }
        return []byte{byte(i)}
    })
    fmt.Println(r)
    fmt.Println(string(r))
}

我确实有使用json解码器的想法,但不幸的是它不理解\xYY语法。

于 2013-04-08T18:21:08.567 回答
3

以下是您可能会如何编写一个小解析器(如果您将来需要支持其他 esc 的东西):

import (
    "fmt"
    "encoding/hex"
)

func decode(bs string) ([]byte,error) {
    in := []byte(bs)
    res := make([]byte,0)
    esc := false
    for i := 0; i<len(in); i++ {
        switch {
        case in[i] == '\\':
            esc = true
            continue
        case esc:
            switch {
            case in[i] == 'x':
                b,err := hex.DecodeString(string(in[i+1:i+3]))
                if err != nil {
                    return nil,err
                }
                res = append(res, b...)
                i = i+2
            default:
                res = append(res, in[i])
            }
            esc = false
        default:
            res = append(res, in[i])
        }
    }
    return res,nil

}

操场

于 2013-04-08T18:50:02.193 回答