Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package xxdgo
- import (
- "fmt"
- "io"
- "os"
- "regexp"
- "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")
- }
- func initVarName(v string) string {
- var allowed = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890"
- var s = strings.Split(v, "")
- for i, c := range s {
- if !strings.Contains(allowed, string(c)) {
- s[i] = "_"
- }
- }
- v = strings.Join(s, "")
- v = regexp.MustCompile(`^_`).ReplaceAllString(v, "I")
- v = regexp.MustCompile(`^\d`).ReplaceAllString(v, "I")
- v = strings.ToUpper(string(v[0])) + v[1:]
- return v
- }
- var Cmd = &cobra.Command{
- Long: "xxd -i but for go",
- Use: "xxdgo file_name",
- Example: `xxdgo image.png -s " " -b 16 >> bytes.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("\n")
- s.WriteString(`var `)
- var varName = initVarName(file.Name())
- s.WriteString(varName)
- 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
- },
- }
Advertisement
Add Comment
Please, Sign In to add comment