bcd.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package ym485
  2. import (
  3. "encoding/hex"
  4. "fmt"
  5. )
  6. // ASCII2Lbcd lbcd adds necessary "0" on the left side of byte array, if number of bytes is odd
  7. func ASCII2Lbcd(data []byte) ([]byte, error) {
  8. if len(data)%2 != 0 {
  9. return bcd(append(data, "0"...))
  10. }
  11. return bcd(data)
  12. }
  13. // ASCII2Rbcd rbcd adds necessary "0" on the left side of byte array, if number of bytes is odd
  14. func ASCII2Rbcd(data []byte) ([]byte, error) {
  15. if len(data)%2 != 0 {
  16. return bcd(append([]byte("0"), data...))
  17. }
  18. return bcd(data)
  19. }
  20. // Encode numeric in ascii into bsd (be sure len(data) % 2 == 0)
  21. func bcd(data []byte) ([]byte, error) {
  22. out := make([]byte, len(data)/2+1)
  23. n, err := hex.Decode(out, data)
  24. if err != nil {
  25. return nil, err
  26. }
  27. return out[:n], nil
  28. }
  29. func Lbcd2ASCII(data []byte) []byte {
  30. r := bcd2Ascii(data)
  31. if r[len(r)-1] == 48 {
  32. r = r[:len(r)-1]
  33. }
  34. return r
  35. }
  36. func Rbcd2ASCII(data []byte) []byte {
  37. r := bcd2Ascii(data)
  38. if r[0] == 48 {
  39. return r[1:]
  40. }
  41. return r
  42. }
  43. func bcd2Ascii(data []byte) []byte {
  44. out := make([]byte, len(data)*2)
  45. n := hex.Encode(out, data)
  46. return out[:n]
  47. }
  48. func Dec2Rbcd(dec int) ([]byte, error) {
  49. return ASCII2Rbcd([]byte(fmt.Sprint(dec)))
  50. }
  51. func Dec2Lbcd(dec int) ([]byte, error) {
  52. return ASCII2Lbcd([]byte(fmt.Sprint(dec)))
  53. }
  54. func Rotate(ss []byte) []byte {
  55. ret := make([]byte, len(ss))
  56. copy(ret, ss)
  57. left, rigth := 0, 0
  58. if len(ret)%2 == 0 {
  59. left = len(ret)/2 - 1
  60. rigth = len(ret) / 2
  61. } else {
  62. left = len(ret)/2 - 1
  63. rigth = len(ret)/2 + 1
  64. }
  65. for ; left >= 0 || rigth <= len(ret)-1; left, rigth = left-1, rigth+1 {
  66. ret[left], ret[rigth] = ret[rigth], ret[left]
  67. }
  68. return ret
  69. }