首页 > 解决方案 > 如何在 Go 中将十六进制字节写入文本文件?

问题描述

我想用 Go 语言将端口 I/O 操作记录到文本文件中。我写了这样一个函数:

func trace (buffer []byte){

    f, err := os.OpenFile("trace.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
    if err != nil {
        return
    }
    defer f.Close()

    for _, val := range buffer{         
        if _, err := f.Write([]byte{val});err!=nil{return}    
    }
}

但是 f.Write 方法写入文件 ASCII 字符串等效,但不是 []byte 值。我需要十六进制值,而不是日志中的字符串。我不明白,为什么代码f.Write([]byte{"string"})是有效的,但类似的东西f.Write([]byte{fmt.Spirintf("%x", val)})不能编译......

标签: filego

解决方案


最后,我的工作代码是:

func trace (buffer []byte){

    if !Debug{return}

    f, err := os.OpenFile("trace.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
    if err != nil {
        return
    }
    defer f.Close()

    date:=fmt.Sprintf("%v", time.Now().Format("2018-01-02 15:01:02 PM Jan Mon"))

    if _, err := f.Write([]byte(date+"\r\n"));err!=nil{return}

    var counter int = 0

    for _, val := range buffer{
        if counter == 16{
            if _, err := f.Write([]byte("\r\n"));err!=nil{return}
            counter=0
        }

        fmt.Fprintf(f, "%02x ", val)
        counter++
    }

    if _, err := f.Write([]byte("\r\n\r\n"));err!=nil{return}

}

推荐阅读