我有一个带有 s 的文本转储文件,string
如下所示:
x\x9cK\xb42\xb5\xaa.\xb6\xb2\xb0R\xcaK-\x09J\xccKOU
我需要将它们转换为[]byte
.
有人可以建议如何在 Go 中做到这一点吗?等效的
是。python
decode('string_escape')
我有一个带有 s 的文本转储文件,string
如下所示:
x\x9cK\xb42\xb5\xaa.\xb6\xb2\xb0R\xcaK-\x09J\xccKOU
我需要将它们转换为[]byte
.
有人可以建议如何在 Go 中做到这一点吗?等效的
是。python
decode('string_escape')
这是一种方法。请注意,这不是对 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
语法。
以下是您可能会如何编写一个小解析器(如果您将来需要支持其他 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
}