【问题标题】:Go - How to convert binary string as text to binary bytes?Go - 如何将二进制字符串作为文本转换为二进制字节?
【发布时间】:2013-04-08 17:45:54
【问题描述】:

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

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

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

有人可以建议如何在 Go 中完成此操作吗?
python 等效于 decode('string_escape')

【问题讨论】:

  • 而 -1 是因为...?
  • 您的问题实际上并非不合适,但您可能得到了负 1,因为我们希望人们展示他们的尝试、他们得到的结果以及他们期望的结果。就目前而言,这听起来有点像“我需要做 x”,“请为我做 x,因为我懒得去寻找自己”......生活和学习 :)
  • How to Ask - Stack Overflow。你做了任何作业并不明显。这就是我对你被否决的原因的猜测。
  • @ChrisFarmiloe - 我想我应该详细说明我到目前为止所做的事情。我尝试了hexstrconv 中的每个函数来解析字符串,并进行了一些手动转换,但没有成功。正如我所说,在 Python 中,您需要一个简单的解码操作,所以我假设 Go 中也存在这样的转换/解码。我花了一天时间试图解决这个问题,所以它远非“请为我做这件事”。我只是期望一个简单的转换函数。

标签: go type-conversion


【解决方案1】:

这是一种方法。请注意,这不是对 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 语法。

【讨论】:

  • 非常感谢。我整天都在试图弄清楚如何做到这一点。我仍然不明白为什么我会收到 -1 的问题。哦,好吧,随便……
【解决方案2】:

以下是编写一个小解析器的方法(如果您将来需要支持其他 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

【讨论】:

  • 谢谢,这看起来确实非常可扩展。我试试看。
猜你喜欢
  • 1970-01-01
  • 2021-02-24
  • 2021-12-20
  • 1970-01-01
  • 2015-08-14
  • 1970-01-01
  • 2016-07-16
相关资源
最近更新 更多