arekkusu6

xxd -i but for go

Nov 1st, 2025 (edited)
1,748
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.85 KB | Source Code | 0 0
  1. package xxdgo
  2.  
  3. import (
  4.     "fmt"
  5.     "io"
  6.     "os"
  7.     "regexp"
  8.     "strings"
  9.  
  10.     "github.com/spf13/cobra"
  11. )
  12.  
  13. var (
  14.     space string
  15.     lineBreak int
  16. )
  17.  
  18. func init() {
  19.     Cmd.Flags().StringVarP(&space, "spaces", "s", "   ", "how much space to use after every break line")
  20.     Cmd.Flags().IntVarP(&lineBreak, "break", "b", 12, "after how many items to add a new break line")
  21. }
  22.  
  23. func initVarName(v string) string {
  24.     var allowed = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890"
  25.  
  26.     var s = strings.Split(v, "")
  27.  
  28.     for i, c := range s {
  29.         if !strings.Contains(allowed, string(c)) {
  30.             s[i] = "_"
  31.         }
  32.     }
  33.  
  34.     v = strings.Join(s, "")
  35.     v = regexp.MustCompile(`^_`).ReplaceAllString(v, "I")
  36.     v = regexp.MustCompile(`^\d`).ReplaceAllString(v, "I")
  37.     v = strings.ToUpper(string(v[0])) + v[1:]
  38.  
  39.     return v
  40. }
  41.  
  42. var Cmd = &cobra.Command{
  43.     Long: "xxd -i but for go",
  44.    
  45.     Use: "xxdgo file_name",
  46.  
  47.     Example: `xxdgo image.png -s "  " -b 16 >> bytes.go`,
  48.  
  49.     Args: cobra.ExactArgs(1),
  50.  
  51.     RunE: func(cmd *cobra.Command, args []string) error {
  52.         file, err := os.OpenFile(args[0], os.O_RDONLY, 0444)
  53.  
  54.         if err != nil {
  55.             return err
  56.         }
  57.  
  58.         defer file.Close()
  59.  
  60.         fileBytes, err := io.ReadAll(file)
  61.  
  62.         if err != nil {
  63.             return err
  64.         }
  65.  
  66.         var s strings.Builder
  67.  
  68.         s.WriteString("\n")
  69.         s.WriteString(`var `)
  70.        
  71.         var varName = initVarName(file.Name())
  72.  
  73.         s.WriteString(varName)
  74.         s.WriteString(` []byte = []byte{`)
  75.         s.WriteString("\n")
  76.         s.WriteString(space)
  77.  
  78.         for i, b := range fileBytes {
  79.             s.WriteString(`0x`)
  80.  
  81.             var hexB = fmt.Sprintf("%x", b)
  82.  
  83.             if len(hexB) == 1 {
  84.                 s.WriteString("0")
  85.             }
  86.    
  87.             s.WriteString(hexB)
  88.             s.WriteString(", ")
  89.  
  90.             if (i + 1) % lineBreak == 0 {
  91.                 s.WriteString("\n")
  92.                 s.WriteString(space)
  93.             }
  94.         }
  95.  
  96.         s.WriteString("\n")
  97.         s.WriteString("}")
  98.  
  99.         fmt.Println(s.String())
  100.  
  101.         return nil
  102.     },
  103. }
Advertisement
Add Comment
Please, Sign In to add comment