Go - 如何将二进制字符串转换为二进制字节?
我有string
就像这一个文本转储文件:Go - 如何将二进制字符串转换为二进制字节?
x\x9cK\xb42\xb5\xaa.\xb6\xb2\xb0R\xcaK-\x09J\xccKOU
我需要将它们转换为[]byte
。
有人可以请建议如何在Go中完成这项工作吗? python
相当于decode('string_escape')
。
这是一种做法。请注意,这并不是对python string_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
语法。
非常感谢。我花了整整一天的时间试图找出如何做到这一点。我仍然不明白为什么我会收到-1的问题。哦,不管... – user1102018 2013-04-08 18:48:50
下面是指导您在写一个小解析器(如果你需要在未来支持其他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
}
谢谢,这看起来非常容易扩展。我会试一试。 – user1102018 2013-04-09 06:42:34
和-1是因为...? – user1102018 2013-04-08 18:03:45
您的问题实际上并不合适,但您可能会减去1,因为我们喜欢让人们展示他们已经尝试了些什么,他们得到了什么结果以及他们期待的结果。它听起来有点像“我需要做x”,“请为我做x,因为我不能自己搜索自己”......生活和学习:) – 2013-04-08 18:53:15
请参阅[如何提问 - 堆栈溢出(http://stackoverflow.com/questions/how-to-ask)。你做功课并不明显。这是我的猜测,为什么你被拒绝投票。 – peterSO 2013-04-08 18:58:18