2013-04-08 216 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

相關問題