utils.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package yu_base64
  2. import (
  3. yu_math "gogs.qqck.cn/s/tools/math"
  4. )
  5. func makeLuts(lutSe [64]byte) ([4096]uint32, [256]uint32, [256]uint32, [256]uint32, [256]uint32) {
  6. lutXe := [4096]uint32{}
  7. lutXd0 := [256]uint32{}
  8. lutXd1 := [256]uint32{}
  9. lutXd2 := [256]uint32{}
  10. lutXd3 := [256]uint32{}
  11. for i := 0; i < 256; i++ {
  12. lutXd0[i] = yu_math.MaxUint32
  13. lutXd1[i] = yu_math.MaxUint32
  14. lutXd2[i] = yu_math.MaxUint32
  15. lutXd3[i] = yu_math.MaxUint32
  16. }
  17. for i, ichar := range lutSe {
  18. for j, jchar := range lutSe {
  19. lutXe[j+i*64] = uint32(ichar) | uint32(jchar)<<8
  20. }
  21. lutXd0[ichar] = uint32(i * 4)
  22. d1 := uint32(i * 16)
  23. lutXd1[ichar] = (d1<<8)&0x0000FF00 | (d1>>8)&0x00000000FF
  24. d2 := uint32(i * 64)
  25. lutXd2[ichar] = (d2<<16)&0x00FF0000 | d2&0x0000FF00
  26. lutXd3[ichar] = uint32(i) << 16
  27. }
  28. return lutXe, lutXd0, lutXd1, lutXd2, lutXd3
  29. }
  30. var (
  31. stdLutSe = [64]byte{
  32. 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
  33. 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
  34. 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
  35. 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/',
  36. }
  37. urlLutSe = [64]byte{
  38. 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
  39. 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
  40. 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
  41. 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_',
  42. }
  43. )
  44. const m3 = 0x00ff00ff00ff00ff // etc.
  45. func reverseBytes32(x uint32) uint32 {
  46. // 摘自 bits.ReverseBytes32
  47. x = x>>8&(m3&yu_math.MaxUint32) | x&(m3&yu_math.MaxUint32)<<8
  48. return x>>16 | x<<16
  49. }