parse.go 941 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. package gen7
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "fmt"
  6. "strings"
  7. "unicode/utf16"
  8. p "github.com/ajswis/go-pkparse-server/pokemon"
  9. )
  10. // Parse accepts a raw pokemon (byte slice) and either returns a Pokemon struct
  11. // with all applicable fields populated or an error depicting the reason for
  12. // failure.
  13. func Parse(rawPokemon p.RawPokemon) (*p.Pokemon, error) {
  14. if l := len(rawPokemon); l < 232 {
  15. return nil, fmt.Errorf("Invalid length for generation 7 pokemon: %d bytes", l)
  16. }
  17. var pkmn p.Pokemon
  18. pkmn.PokedexNumber = uint(rawPokemon[0x08])
  19. pkmn.RawNickname = rawPokemon[0x40:0x58]
  20. pkmn.Nickname = binaryToUTF16leString(pkmn.RawNickname)
  21. pkmn.RawPokemon = &rawPokemon
  22. return &pkmn, nil
  23. }
  24. func binaryToUTF16leString(b []byte) string {
  25. r := bytes.NewReader(b)
  26. u16 := make([]uint16, len(b)/2)
  27. binary.Read(r, binary.LittleEndian, &u16)
  28. runes := utf16.Decode(u16)
  29. s := strings.Split(string(runes), "\u0000")[0]
  30. return s
  31. }