Go - 如何将包含十六进制字符的txt文件解码/转换为可读字符串

Asa*_*saf 6 hex json nginx decoding go

我有一个日志文件,其中每一行都是JSON.由于一些Nginx安全原因,日志以十六进制格式保存(例如,char"将转换为\ x22).以下是JSON行的示例:

 { "body_bytes_sent": "474", "params": {\x22device_id\x22: \x221234567890\x22} }
Run Code Online (Sandbox Code Playgroud)

我的目标:

  1. 逐行读取文件.
  2. 将每一行转换为可读格式

    { "body_bytes_sent": "474", "params" : {"device_id": "1234567890"} }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将此字符串转换为JSON对象,以便我可以操作它.

任何帮助将不胜感激.

Not*_*fer 5

您可以使用strconv.Unquote将字符串转换为普通字符串:

package main

import (
    "encoding/json"
    "fmt"
    "strconv"
)

func main() {

    // this is what your input string looks like...
    qs := "{\\x22device_id\\x22: \\x221234567890\\x22}"

    // now let's convert it to a normal string
    // note that it has to look like a Go string literal so we're
    // using Sprintf
    s, err := strconv.Unquote(fmt.Sprintf(`"%s"`, qs))
    if err != nil {
        panic(err)
    }
    fmt.Println(s)

    // just for good measure, let's see if it can actually be decoded.
    // SPOILER ALERT: It decodes just fine!
    var v map[string]interface{}
    if err := json.Unmarshal([]byte(s), &v); err != nil {
        panic(err)

    }
    fmt.Println(v)
}
Run Code Online (Sandbox Code Playgroud)

Playground