package xxdgo import ( "fmt" "io" "os" "strings" "github.com/spf13/cobra" ) var ( space string lineBreak int ) func init() { Cmd.Flags().StringVarP(&space, "spaces", "s", " ", "how much space to use after every break line") Cmd.Flags().IntVarP(&lineBreak, "break", "b", 12, "after how many items to add a new break line") } var Cmd = &cobra.Command{ Long: "xxd -i but for go", Use: "xxdgo file_name", Example: `xxdgo image.png -s " " -b 16 >> rawbytes.go`, Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { file, err := os.OpenFile(args[0], os.O_RDONLY, 0444) if err != nil { return err } defer file.Close() fileBytes, err := io.ReadAll(file) if err != nil { return err } var s strings.Builder s.WriteString(`var `) var varName = strings.ReplaceAll(file.Name(), ".", "_") var upperName = strings.ToUpper(string(varName[0])) + varName[1:] s.WriteString(upperName) s.WriteString(` []byte = []byte{`) s.WriteString("\n") s.WriteString(space) for i, b := range fileBytes { s.WriteString(`0x`) var hexB = fmt.Sprintf("%x", b) if len(hexB) == 1 { s.WriteString("0") } s.WriteString(hexB) s.WriteString(", ") if (i + 1) % lineBreak == 0 { s.WriteString("\n") s.WriteString(space) } } s.WriteString("\n") s.WriteString("}") fmt.Println(s.String()) return nil }, }