Golang: How to printf % x for bytes in a struct?

huangapple go评论83阅读模式
英文:

Golang: How to printf % x for bytes in a struct?

问题

以下是翻译的内容:

var b [88]byte
n, err := file.Read(b[:])
fmt.Printf("读取的字节数:%d 字节:[% x]\n", n, b)

上述代码以十六进制打印字节

我有一个如下的结构体

    type SomeStruct struct {
       field1 []byte
       field2 []byte
    }
    someStructInstance := SomeStruct{[249 190 180 217], [29 1 0 0]}
    fmt.Println(someStructInstance)
    => {[249 190 180 217] [29 1 0 0]}
   
但是我希望它以十六进制打印

    => {[f9 be b4 d9] [1d 01 00 00]}

我该如何实现这个目标
英文:
var b [88]byte
n, err := file.Read(b[:])
fmt.Printf("bytes read: %d Bytes: [% x]\n", n, b)

The above prints bytes in hexdecimal

I have a struct like this

type SomeStruct struct {
   field1 []byte
   field2 []byte
}
someStructInstance := SomeStruct{[249 190 180 217], [29 1 0 0]}
fmt.Println(someStructInstance)
=> {[249 190 180 217] [29 1 0 0]}

But ideally I would like it to print hexdecimal

=> {[f9 be b4 d9] [1d 01 00 00]}

How would I go about that?

答案1

得分: 5

我认为你只需要在SomeStruct上定义自己的String函数。这是一个示例:

package main

import "fmt"

type SomeStruct struct {
   field1 []byte
   field2 []byte
}

func (s SomeStruct) String() string {
  return fmt.Sprintf("{[% x] [% x]}", s.field1, s.field2)
}

func main() {
  someStructInstance := SomeStruct{[]byte{249, 190, 180, 217}, []byte{29, 1, 0, 0}}
  fmt.Println(someStructInstance)
}

在Go Playground上运行它:http://play.golang.org/p/eYBa1n33a2

英文:

I think you will just have to define your own String function on SomeStruct. Here is an example:

package main

import "fmt"

type SomeStruct struct {
   field1 []byte
   field2 []byte
}

func (s SomeStruct) String() string {
  return fmt.Sprintf("{[% x] [% x]}", s.field1, s.field2)
}

func main() {
  someStructInstance := SomeStruct{[]byte{249, 190, 180, 217}, []byte{29, 1, 0, 0}}
  fmt.Println(someStructInstance)
}

See it in running on the Go Playground: http://play.golang.org/p/eYBa1n33a2

答案2

得分: 3

你可以使用反射来检查结构体并打印其中的任何[]byte

package main

import (
	"fmt"
	"reflect"
)

type SomeStruct struct {
	field1 []byte
	field2 []byte
}

type OtherStruct struct {
	intValue  int
	intSlice  []int
	byteSlice []byte
}

var typeOfBytes = reflect.TypeOf([]byte(nil))

func printSlicesHex(obj interface{}) {
	value := reflect.ValueOf(obj)
	typeOfObj := value.Type()
	for i := 0; i < value.NumField(); i++ {
		field := value.Field(i)
		if field.Type() == typeOfBytes {
			bytes := field.Bytes()
			printBytes(typeOfObj.Field(i).Name, bytes)
		}
	}
}

func printBytes(name string, bytes []byte) {
	fmt.Printf("%s: [% x]\n", name, bytes)
}

func main() {
	someStructInstance := SomeStruct{[]byte{249, 190, 180, 217}, []byte{29, 1, 0, 0}}
	fmt.Println("Printing []bytes in SomeStruct")
	printSlicesHex(someStructInstance)
	fmt.Println()

	otherStruct := OtherStruct{0, []int{0, 1, 2}, []byte{0, 1, 2, 3}}
	fmt.Println("Printing []bytes in OtherStruct")
	printSlicesHex(otherStruct)
}

这个示例会打印每个[]byte字段的名称和数据(以十六进制形式)。你可以通过传入一个自定义函数来改进它,以便不总是以十六进制形式打印。

Playground链接

英文:

You could use reflection to inspect the struct and print any []bytes that it has.

package main

import (
	&quot;fmt&quot;
	&quot;reflect&quot;
)

type SomeStruct struct {
	field1 []byte
	field2 []byte
}

type OtherStruct struct {
	intValue  int
	intSlice  []int
	byteSlice []byte
}

var typeOfBytes = reflect.TypeOf([]byte(nil))

func printSlicesHex(obj interface{}) {
	value := reflect.ValueOf(obj)
	typeOfObj := value.Type()
	for i := 0; i &lt; value.NumField(); i++ {
		field := value.Field(i)
		if field.Type() == typeOfBytes {
			bytes := field.Bytes()
			printBytes(typeOfObj.Field(i).Name, bytes)
		}
	}
}

func printBytes(name string, bytes []byte) {
	fmt.Printf(&quot;%s: [% x]\n&quot;, name, bytes)
}

func main() {
	someStructInstance := SomeStruct{[]byte{249, 190, 180, 217}, []byte{29, 1, 0, 0}}
	fmt.Println(&quot;Printing []bytes in SomeStruct&quot;)
	printSlicesHex(someStructInstance)
	fmt.Println()

	otherStruct := OtherStruct{0, []int{0, 1, 2}, []byte{0, 1, 2, 3}}
	fmt.Println(&quot;Printing []bytes in OtherStruct&quot;)
	printSlicesHex(otherStruct)
}

For each []byte, this example prints the name of the field and its data (in hex). You could improve on this by taking a custom function to do the printing, so you don't always have to print in hex.

Playground Link

huangapple
  • 本文由 发表于 2014年1月6日 06:23:21
  • 转载请务必保留本文链接:https://go.coder-hub.com/20939998.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定