【问题标题】:Convert hex to alphabet将十六进制转换为字母
【发布时间】:2015-05-06 22:49:31
【问题描述】:

如何从 Go 中的十六进制值中获取字母值?

package main

import (
    "encoding/hex"
    "fmt"
)

func main() {
    a := []byte{0x61}
    c := hex.Dump(a)
    fmt.Println(c,a)
}

http://play.golang.org/p/7iAs2kKw5v

【问题讨论】:

    标签: string go formatting hex


    【解决方案1】:

    您可以使用fmt.Printf() 格式(example):

    func main() {
        a := []byte{0x61}
        c := hex.Dump(a)
        fmt.Printf("'%+v' -- '%s'\n", c, a)
    }
    

    输出:

    '00000000  61                                                |a|
    ' -- 'a'
    

    %s 格式足以转换 'a' 中的 0x61

    【讨论】:

      【解决方案2】:

      你的问题有点误导。

      根据您的问题,您真正想要的是将byte 值或[]byte(字节切片)转换为string 或字符(在Go 中或多或少是rune)。

      从今以后,我将使用这些变量将单个 byte 值与 []byte 分开:

      b := byte(0x61)
      bs := []byte{b}
      

      要将其转换为string,您只需使用最干净、最简单的转换即可:

      s := string(bs)
      

      如果你想要它作为一个“字符”,你可以将它转换成rune

      r := rune(b)
      

      另一种解决方案是使用VonC's answer 中提到的fmt.Printf() 并使用%s 动词,即:

      %s  the uninterpreted bytes of the string or slice
      

      您可能想看看这些替代方案:

      %c  the character represented by the corresponding Unicode code point
      %q  a single-quoted character literal safely escaped with Go syntax.
      

      %q 接受 byte[]byterune

      查看这个小例子来演示这些(在Go Playground 上试试):

      b := byte(0x61)
      bs := []byte{b}
      
      fmt.Printf("%s\n", bs)
      fmt.Printf("%c\n", b)
      fmt.Println(string(bs))
      
      fmt.Printf("%q\n", bs)
      fmt.Printf("%q\n", b)
      fmt.Printf("%q\n", rune(b))
      

      输出:

      a
      a
      a
      "a"
      'a'
      'a'
      

      如果您需要string 形式的结果,您可以使用satran's answer 中提到的fmt.Sprintf() 变体,如下所示:

      s := fmt.Sprintf("%s", bs)
      

      但只使用string 转换(string(bs))会更容易。

      【讨论】:

      • 我接受了“误导”部分,但首先尝试了一个简单的答案,等待 OP 澄清。你的更完整。 +1
      【解决方案3】:

      如果你只想要字符串,你可以fmt.Sprintf

      package main
      
      import (
          "fmt"
      )
      
      func main() {
          a := []byte{0x61}
          c := fmt.Sprintf("%s", a)
          fmt.Println(c)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-22
        • 2011-07-28
        • 1970-01-01
        • 1970-01-01
        • 2018-01-31
        相关资源
        最近更新 更多