ip.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package service
  2. import (
  3. "fmt"
  4. "math"
  5. "net"
  6. )
  7. const sixtyTwo uint64 = 62
  8. func encode(num uint64) string {
  9. var numStr string
  10. for num != 0 {
  11. r := num % sixtyTwo
  12. if r <= 9 {
  13. numStr = string(byte(r)+48) + numStr
  14. } else if r <= 35 {
  15. numStr = string(byte(r)+87) + numStr
  16. } else {
  17. numStr = string(byte(r)+29) + numStr
  18. }
  19. num = num / sixtyTwo
  20. }
  21. return numStr
  22. }
  23. func decode(bs []byte) uint64 {
  24. f := 0.0
  25. l := len(bs) - 1
  26. for _, v := range bs {
  27. if v >= 97 {
  28. v -= 87
  29. } else if v >= 65 {
  30. v -= 29
  31. } else {
  32. v -= 48
  33. }
  34. f = f + float64(v)*math.Pow(float64(sixtyTwo), float64(l))
  35. l = l - 1
  36. }
  37. return uint64(f)
  38. }
  39. // ntoIPv6 conver uint32 to ip addr.
  40. func ntoIPv6(sip []string) string {
  41. if len(sip) != 3 {
  42. return ""
  43. }
  44. ip := make(net.IP, net.IPv6len)
  45. sum := decode([]byte(sip[0]))
  46. ip[0] = byte((sum >> 40) & 0xFF)
  47. ip[1] = byte((sum >> 32) & 0xFF)
  48. ip[2] = byte((sum >> 24) & 0xFF)
  49. ip[3] = byte((sum >> 16) & 0xFF)
  50. ip[4] = byte((sum >> 8) & 0xFF)
  51. ip[5] = byte(sum & 0xFF)
  52. sum = decode([]byte(sip[1]))
  53. ip[6] = byte((sum >> 40) & 0xFF)
  54. ip[7] = byte((sum >> 32) & 0xFF)
  55. ip[8] = byte((sum >> 24) & 0xFF)
  56. ip[9] = byte((sum >> 16) & 0xFF)
  57. ip[10] = byte((sum >> 8) & 0xFF)
  58. ip[11] = byte(sum & 0xFF)
  59. sum = decode([]byte(sip[2]))
  60. ip[12] = byte((sum >> 24) & 0xFF)
  61. ip[13] = byte((sum >> 16) & 0xFF)
  62. ip[14] = byte((sum >> 8) & 0xFF)
  63. ip[15] = byte(sum & 0xFF)
  64. return ip.String()
  65. }
  66. // ipv6AtoN conver ip addr to uint32.
  67. func ipv6AtoN(ip net.IP) (sip string) {
  68. ip = ip.To16()
  69. if ip == nil {
  70. return
  71. }
  72. sum := uint64(ip[0]) << 40
  73. sum += uint64(ip[1]) << 32
  74. sum += uint64(ip[2]) << 24
  75. sum += uint64(ip[3]) << 16
  76. sum += uint64(ip[4]) << 8
  77. sum += uint64(ip[5])
  78. sip = encode(sum)
  79. sum = uint64(ip[6]) << 40
  80. sum += uint64(ip[7]) << 32
  81. sum += uint64(ip[8]) << 24
  82. sum += uint64(ip[9]) << 16
  83. sum += uint64(ip[10]) << 8
  84. sum += uint64(ip[11])
  85. sip = sip + ":" + encode(sum)
  86. sum = uint64(ip[12]) << 24
  87. sum += uint64(ip[13]) << 16
  88. sum += uint64(ip[14]) << 8
  89. sum += uint64(ip[15])
  90. sip = sip + ":" + encode(sum)
  91. fmt.Println(sip, "len:", len(sip))
  92. return
  93. }
  94. // netAtoN conver ipv4 addr to uint32.
  95. func netAtoN(ip net.IP) (sum uint32) {
  96. ip = ip.To4()
  97. if ip == nil {
  98. return
  99. }
  100. sum += uint32(ip[0]) << 24
  101. sum += uint32(ip[1]) << 16
  102. sum += uint32(ip[2]) << 8
  103. sum += uint32(ip[3])
  104. return sum
  105. }
  106. // netNtoA conver uint32 to ipv4 addr.
  107. func netNtoA(sum uint32) string {
  108. ip := make(net.IP, net.IPv4len)
  109. ip[0] = byte((sum >> 24) & 0xFF)
  110. ip[1] = byte((sum >> 16) & 0xFF)
  111. ip[2] = byte((sum >> 8) & 0xFF)
  112. ip[3] = byte(sum & 0xFF)
  113. return ip.String()
  114. }
  115. func parseIP(s string) (net.IP, bool) {
  116. for i := 0; i < len(s); i++ {
  117. switch s[i] {
  118. case '.':
  119. return net.ParseIP(s), true
  120. case ':':
  121. return net.ParseIP(s), false
  122. }
  123. }
  124. return nil, false
  125. }