【问题标题】:Decode base64 and encode it to hex解码base64并将其编码为十六进制
【发布时间】:2019-07-08 16:21:53
【问题描述】:

我有以下代码解码 base64,然后将其编码为十六进制。

doc_id := "Can35qPeFkm9Xgmp9+aj3g=="
base64_decode, err := base64.StdEncoding.DecodeString(doc_id)
if err != nil {
log.Fatal("error:", err)
}
base64_decoded := fmt.Sprintf("%q", base64_decode)
fmt.Printf("base_decoded %v\n", base64_decoded)



src := []byte(base64_decoded)
fmt.Println(src)
hex_encode := make([]byte, hex.EncodedLen(len(src)))
hex.Encode(hex_encode, src)
hex_encoded := fmt.Sprintf("%s", hex_encode)
fmt.Printf("hex_encoded %v", hex_encoded)

其中 doc_id 是 base64 格式。 base64_decoded 是它的解码值。 我必须将它编码为十六进制,所以我将它传递给 src。

问题是当我将标识符 base64_decoded 传递给 src 时,当我传入 base64_decoded 所持有的值时,我得到了错误的答案。 例如: 如果我得到 base64_decoded 值为 "\x11z\xc0[d~\xfcK\xb1\xf8\x11z\xc0[d~" 如果我通过它的值“\x11z\xc0[d~\xfcK\xb1\xf8\x11z\xc0[d~”,我得到正确答案 117ac05b647efc4bb1f8117ac05b647e

如果我传递持有“\x11z\xc0[d~\xfcK\xb1\xf8\x11z\xc0[d~”的变量,我得到错误答案 225c7831317a5c7863305b647e5c7866634b5c7862315c7866385c7831317a5c2863305bp6

这个作业有什么问题吗base64_decoded := fmt.Sprintf("%q", base64_decode)

我做错了什么

【问题讨论】:

    标签: go base64 hex


    【解决方案1】:

    使用以下代码:

    doc_id := "Can35qPeFkm9Xgmp9+aj3g=="
    base64_decode, err := base64.StdEncoding.DecodeString(doc_id)
    if err != nil {
        log.Fatal("error:", err)
    }
    fmt.Println(hex.EncodeToString(base64_decode))
    

    直接将base64_decode中的字节编码为十六进制。

    fmt.Sprintf("%q", base64_decode) 的调用返回一个字符串,其中的字节按照 Go 的字符串文字规则进行了转义。在一般情况下,返回字符串中的字节不等于base64_decode 中的字节。例如输入字节 0x11 转义为四个字节\x11

    【讨论】:

      【解决方案2】:

      发生的情况是 fmt.Sprintf("%q", base64_decode) 对 base64_decode 的转换,在这个过程中转换内存中的一些字节丢失了。

      下面我给你举个例子:https://play.golang.org/p/pdQBp7NsvQM

      doc_id := "Can35qPeFkm9Xgmp9+aj3g=="
      var_encode := b64.StdEncoding.EncodeToString([]byte(doc_id))
      fmt.Println(var_encode)
      var_decode , _ := b64.StdEncoding.DecodeString(var_encode)
      fmt.Println(string(var_decode))
      

      【讨论】:

        猜你喜欢
        • 2019-08-16
        • 2019-03-20
        • 2020-06-15
        • 2013-06-10
        • 1970-01-01
        • 1970-01-01
        • 2013-09-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多