Posted to tcl by patthoyts at Tue Jun 24 20:51:15 GMT 2008view raw

  1. # C:\temp\t2i.vfs>tclkitsh86 ip.tcl
  2. # yours: 62.128.158.232 35.61 microseconds per iteration
  3. # mine : 62.128.158.232 4.42 microseconds per iteration
  4. # mine2: 62.128.158.232 3.96 microseconds per iteration
  5. # yours: 1048616680 55.97 microseconds per iteration
  6. # mine : 1048616680 42.98 microseconds per iteration
  7. # mine2: 1048616680 6.89 microseconds per iteration
  8.  
  9. proc long2ip {long} {
  10. set x $long
  11. set d [expr $x % 256]
  12. set x [expr ($x-$d)/256]
  13. set c [expr $x % 256]
  14. set x [expr ($x-$c)/256]
  15. set b [expr $x % 256]
  16. set x [expr ($x-$b)/256]
  17. set a [expr $x % 256]
  18.  
  19. return "$a.$b.$c.$d"
  20. }
  21.  
  22. proc ip2long {ip} {
  23. if ![regexp {([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)} $ip -> a b c d] {
  24. return 0
  25. }
  26.  
  27. return [expr (($a*256+$b)*256+$c)*256+$d]
  28. }
  29.  
  30. # -------------------------------------------------------------------------
  31.  
  32. proc long2ip_pat {long} {
  33. set x $long
  34. set d [expr {$x % 256}]
  35. set x [expr {($x-$d)/256}]
  36. set c [expr {$x % 256}]
  37. set x [expr {($x-$c)/256}]
  38. set b [expr {$x % 256}]
  39. set x [expr {($x-$b)/256}]
  40. set a [expr {$x % 256}]
  41.  
  42. return "$a.$b.$c.$d"
  43. }
  44.  
  45. proc long2ip_pat2 {long} {
  46. set a [expr {($long >> 24) & 0xff}]
  47. set b [expr {($long >> 16) & 0xff}]
  48. set c [expr {($long >> 8) & 0xff}]
  49. set d [expr { $long & 0xff}]
  50. return "$a.$b.$c.$d"
  51. }
  52.  
  53. proc ip2long_pat {ip} {
  54. if {![regexp {([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)} $ip -> a b c d]} {
  55. return 0
  56. }
  57.  
  58. return [expr {(($a*256+$b)*256+$c)*256+$d}]
  59. }
  60.  
  61. proc ip2long_pat2 {ip} {
  62. set octets [split $ip .]
  63. if {[llength $octets] != 4} { return 0 }
  64. foreach oct $octets { if {$oct < 0 || $oct > 255} { return 0 } }
  65. foreach {a b c d} $octets break
  66. return [expr {($a << 24) | ($b << 16) | ($c << 8) | $d}]
  67. }
  68.  
  69. proc Test {} {
  70. set addr [expr {0x3e809ee8}]
  71. puts "yours: [long2ip $addr]\t[time {long2ip $addr} 100]"
  72. puts "mine : [long2ip_pat $addr]\t[time {long2ip_pat $addr} 100]"
  73. puts "mine2: [long2ip_pat2 $addr]\t[time {long2ip_pat2 $addr} 100]"
  74.  
  75. set ip 62.128.158.232
  76. puts "yours: [ip2long $ip]\t[time {ip2long $ip} 100]"
  77. puts "mine : [ip2long_pat $ip]\t[time {ip2long_pat $ip} 100]"
  78. puts "mine2: [ip2long_pat2 $ip]\t[time {ip2long_pat2 $ip} 100]"
  79. }
  80.  
  81. if {!$tcl_interactive} {
  82. set r [catch [linsert $argv 0 Test] err]
  83. if {$r} {puts $errorInfo}
  84. exit $r
  85. }