2013-04-08 277 views
1

我有string就像这一个文本转储文件:Go - 如何将二进制字符串转换为二进制字节?

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

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

有人可以请建议如何在Go中完成这项工作吗?
python相当于decode('string_escape')

+0

和-1是因为...? – user1102018 2013-04-08 18:03:45

+4

您的问题实际上并不合适,但您可能会减去1,因为我们喜欢让人们展示他们已经尝试了些什么,他们得到了什么结果以及他们期待的结果。它听起来有点像“我需要做x”,“请为我做x,因为我不能自己搜索自己”......生活和学习:) – 2013-04-08 18:53:15

+1

请参阅[如何提问 - 堆栈溢出(http://stackoverflow.com/questions/how-to-ask)。你做功课并不明显。这是我的猜测,为什么你被拒绝投票。 – peterSO 2013-04-08 18:58:18

回答

3

这是一种做法。请注意,这并不是对python string_escape格式的完整解码,但根据您提供的示例可能已足够。

playground link

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语法。

+0

非常感谢。我花了整整一天的时间试图找出如何做到这一点。我仍然不明白为什么我会收到-1的问题。哦,不管... – user1102018 2013-04-08 18:48:50

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 

} 

playground

+0

谢谢,这看起来非常容易扩展。我会试一试。 – user1102018 2013-04-09 06:42:34

相关问题