èšè¿°ã«ã¯ã expect-expect.sourceforge.netã䜿çšããŸãããããã¯ãããŸããŸãªå¯Ÿè©±åã³ã³ãœãŒã«ãŠãŒãã£ãªãã£ãç¹ã«telnetã®å¿çãåŠçããŠå¿çã§ããTCLã®ã¢ããªã³ã§ãã TCLã以åã«äœæããå¿ èŠããªãã£ããããã³ãŒããåèããå¿ èŠããããŸããã ã¹ã¯ãªããã®éèŠãªç¬éã¯ãåŠçã®ããã®IPv4ã¢ãã¬ã¹ã®ãªã¹ãã®ãžã§ãã¬ãŒã¿ãŒã§ãããæ éã«è©äŸ¡ããçµæããã®ããã°ã©ã ã¯ãç§ã®æèŠã§ã¯ãå€§å¹ ã«æé©åã§ããå°ãªããšã3åã®1ã®è¡æ°ãåæžããæ°ããæ©èœãç°¡åã«è¿œå ã§ããŸããã ããã«ãããããã¹ãŠã®åæžã¯TCLã®è©³çŽ°ãšã¯ã»ãšãã©é¢ä¿ããããŸããã§ããããã¢ã«ãŽãªãºã å šäœã®æ§ç¯ã«å¯Ÿããåºæ¬çãªã¢ãããŒãã«é¢ä¿ããŠããŸããã
ãã®ã³ãŒããå¥ã®ãŠãŒãã£ãªãã£ãšããŠå²ãåœãŠãŸãããããã¹ãã®åŸåã§è©³çŽ°ã«åæããŸãããåããšãåŸãã«ãªã£ãçç±ãããã³ãåŸããšããŠããã«èšè¿°ã§ããªãã£ãçç±ã§ãã ç§ã¯ãŸã ããã«ã€ããŠãã¹ãŠã奜ãã§ã¯ãããŸããïŒã¢ã«ãŽãªãºã ã®åââé¡ãšTCLã®åé¡ã®äž¡æ¹ãæ··åããŸããããšãã°ãé åã®ä»£ããã«ãªã¹ãã䜿çšãããšïŒé«éãå®å šãã€ããªãã®ãŒçã«æ£ç¢ºã§ããïŒïŒ
ãŠãŒãã£ãªãã£ïŒcipl.tlïŒã®ããžãã¯ã¯æ¬¡ã®ãšããã§ããã³ãã³ãã©ã€ã³ã§2ã€ã®ãã©ã¡ãŒã¿ãŒãèšå®ããŸãããªã¹ãã®äœæãéå§ããIPv4ã¢ãã¬ã¹ãšããªã¹ãã®çµäºã«äœ¿çšããIPv4ã¢ãã¬ã¹ããŸãã¯ãªã¹ãã«å«ããèŠçŽ ã®æ°ã瀺ãæ°å€ã§ãã æ§ç¯ã®é åºã¯ãäœãã¢ãã¬ã¹ïŒæåã®ãã©ã¡ãŒã¿ãŒïŒãã倧ããã¢ãã¬ã¹ãŸã§ã§ãã 2çªç®ã®ãã©ã¡ãŒã¿ãŒãçç¥ãããšãéå§IPv4ã¢ãã¬ã¹ã®ã¿ã§æ§æããããªã¹ãã衚瀺ãããŸãã
> cipl.tl 192.0.2.1 1 192.0.2.1 192.0.2.2 > cipl.tl 192.0.2.1 192.0.2.2 192.0.2.1 192.0.2.2 > cipl.tl 192.0.2.1 192.0.2.1
Windowsã®å Žåãã¹ã¯ãªããã¯tclshã€ã³ã¿ãŒããªã¿ãŒãšãšãã«èµ·åãããŸããå®éã«ã¯ã* nixã§ãå®è¡ã§ããŸãã
> tclsh cipl.tl 192.0.2.1 192.0.2.1
ããã«ãã³ãŒããåŒçšããŠãè¡çªå·ãšããŒãžã§ã³ãæäŸããã³ã¡ã³ãããŸãã çµæã®ããŒãžã§ã³ã¯ããããã¯ã®æåŸã«ãããªã³ã¯ãéžæã§ããŸãã
Verã1ãNoã1-12
#!/usr/bin/tclsh8.5 set exip {^(2(5[0-5]|[0-4]\d)|1\d{2}|[1-9]\d{0,1})(\.(2(5[0-5]|[0-4]\d)|1\d{2}|[1-9]\d|\d)){3}$} set exdg {^(0?|([1-9]\d{0,5}))$} if {$argc == 0 || $argc > 2} then { puts "cipl.tl - IP " puts ": cipl.tl <start IP> \[<count>|<finish IP>\]" puts ": <start IP> - IPv4 <finish IP>" puts "\t <finish IP> - IPv4 " puts "\t <count> - 0 999999" } else {
æåã®è¡ã¯ã䜿çšããå¿ èŠãããã€ã³ã¿ãŒããªã¿ãŒã瀺ããŠããŸããããã¯Linuxçšã®è¡ã§ãã äžè¬ã«ãtclshãžã®ãã«ãã¹ãæå®ããå¿ èŠããããŸããããšãã°ãFreeBSDã®å Žåããã®è¡ã¯æ¬¡ã®ããã«ãªããŸãã
#!/usr/local/bin/tclsh8.5
次ã«ãããã°ã©ã ã§ããã«äœ¿çšããæ£èŠè¡šçŸã§ããexipããã³exdgå€æ°ãèšå®ããŸã ã IPv4ã¢ãã¬ã¹ãæ£ããå ¥åãããããšã確èªããã«ã¯ãæåã®å€æ°ãå¿ èŠã§ãã 1.0.0.0ãã255.255.255.255ãŸã§ã®10é²åœ¢åŒã§èšè¿°ãããæ£ããã¢ãã¬ã¹ã¯ããã®æ£èŠè¡šçŸã«è©²åœããŸããã€ãŸãã192.0.02.010ã®åœ¢åŒã®ã¢ãã¬ã¹ãèšå®ããŠãæ©èœããŸããã 2çªç®ã®å€æ°ã¯ãå è¡ãŒããªãã§çªå·ã決å®ããŸã-ãªã¹ãã®æå¹ãªå¢çã¯0ã999999ã§ã空ã®æååãtrueã§ãã ç§ã®æèŠã§ã¯ã999999ãè¶ ããå¶éã¯åççã§ãããããã«ã次æ°32ã®æ°å€2ã«å¯Ÿå¿ããæ£èŠè¡šçŸãæ¢ãã®ã«æéãç¡é§ã«ããŸããã§ããããããã®æ£èŠè¡šçŸã¯ããã«ã¯è¡šç€ºãããŸããã§ãããããœãªã¥ãŒã·ã§ã³ã®ããŒãºã«åºã¥ããŠè¿œå ãããŸããããã®ãããªããããããã¯ããå°ãèŠãããŸãã
次ã«ã ifæ¡ä»¶ããã§ãã¯ãããŸã-ã³ãã³ãã©ã€ã³ããæž¡ããããã©ã¡ãŒã¿ãŒã®æ°ã0ãããå ŽåããŸãã¯2ãè¶ ããå Žåãå°ããªãã«ãã衚瀺ãããŸãã ãã®æç¹ã§ã¯ãäœãåºåããå¿ èŠã¯ãããŸããããæåã®2ã€ã®ãã©ã¡ãŒã¿ãŒãç®çã®ãã©ã¡ãŒã¿ãŒãšããŠäœ¿çšããã ãã§ããšã©ãŒãçºçããŠãåºåãä¹±ããããšãªããŠãŒãã£ãªãã£ã®ãããæäœã«éäžã§ããŸãã
æåŸã®è¡ã¯ãã¡ã€ã³åŠçãè¡ãããelseãããã¯ãéããŸãã
Verã1ãNoã12-17
} else { set startip [lindex $argv 0] set countip [lindex $argv 1] set getcountip $countip if {[regexp $exip $startip]} then { set octsip [split $startip {.}]
ãã®ããŒãã§ã¯ãæåã«å ¥åã§åãåã£ããã©ã¡ãŒã¿ãŒãstartipå€æ°ïŒæåã®ãã©ã¡ãŒã¿ãŒcountip -2çªç®ã®ãã©ã¡ãŒã¿ãŒïŒã«ä¿åããŸãã2çªç®ã®ãã©ã¡ãŒã¿ãŒããªãå Žåã lindexã¯ç©ºã®æååãè¿ããŸãã ãŸãã2çªç®ã®ãã©ã¡ãŒã¿ãŒãè¿œå å€æ°getcountipã«ä¿åããŸãã
次ã«ãæåã«æå®ããæ£èŠè¡šçŸã§regexpããã³exipå€æ°ã䜿çšããŠãæåã®ãã©ã¡ãŒã¿ãŒãæ£ããIPã¢ãã¬ã¹ãšäžèŽããããšã確èªããŸãã ãã®æ¡ä»¶ã§ã¯ãIPv4ã¢ãã¬ã¹ãäºæ³ãšå®å šã«äžèŽããŠããããšãéèŠã§ããããã¯ã splitã䜿çšããŠoctsipãªã¹ããäœæãã次ã®è¡ã§ããããæåãã»ãã¬ãŒã¿ãŒãšããŠæ©èœããããã§ãã çµæã®ãªã¹ãã«ã¯ãè¿œå ã®ãã§ãã¯ãªãã§ããããæäœããããã«ãå è¡ãŒããªãã§æ£ããå Žæã«0ãã255ãŸã§ã®10é²æ°ã®ã¿ãå«ãŸããŠããå¿ èŠããããŸãã ããã§ã¯ãããšãã°ãæ°å€011ã眮æããããšã8é²æ°ãšããŠèªèãããéãïŒã€ãŸãã10é²æ³ã§ã¯9ã«çããïŒãå è¡ãŒãã圹å²ãæãããŸãã
æ€çŽ¢ãšã³ãžã³ã§ã®ã¯ãšãªã¯ããããã®ãã¹ãŠã®æ¡ä»¶ããã§ãã¯ããªãæ£èŠè¡šçŸã«ã€ãªããããšãéåžžã«å€ããããå€ãã®å Žåãã°ã«ãŒãå ã®3æ¡ã®4ã€ã®ã°ã«ãŒãããã§ãã¯ããã ãã§ãã ããšãã°ã habrahabr.ru / blogs / webdev / 123845ã®åŒã¯ããã¡ããIPã¢ãã¬ã¹ã§ãã000.100.1.010ã®æ§ç¯ãèš±å¯ããŸããã8é²æ°ãŸãã¯10é²æ°ãæ確ã«æ±ºå®ããããã§ã¯ãªããããäžç¢ºå®æ§ãçãããããªãæ€èšŒãå¿ èŠã§ãã
Verã1ãNoã18-35
if {[regexp $exip $countip]} then { set octfip [split $countip {.}] set octsub {0} set countip {0} for {set i 3} {$i>=0} {incr i -1} { if {[set octsub [expr [lindex $octfip $i] - [lindex $octsip $i]]] < 0} then { if {$i > 0} then { set si [expr $i - 1] set octfip [lreplace $octfip $si $si [expr [lindex $octfip $si] - 1]] set octsub [expr 256 + $octsub] } else { break } } set ni [expr 3 - $i] set countip [expr $countip + ($octsub * (1 << ($ni * 8)))] } }
ããã§ã2çªç®ã®ãã©ã¡ãŒã¿ãŒãæå¹ãªIPv4ã¢ãã¬ã¹ã§ãããã©ããã確èªããããã§ããå Žåã¯ããã®ã¢ãã¬ã¹ãšæåã®ãã©ã¡ãŒã¿ãŒã§æå®ãããã¢ãã¬ã¹ãšã®å·®ãèšç®ããããšããŸããã€ãŸãããã®ãããã¯ã®åºåã§ã¯ã countipå€æ°ã«ãªã¹ãé·ã®æ£ããå€ãå«ãŸããŠããå¿ èŠããããŸãã ã¢ããã¹ããªãŒã ãã§ãã¯ã«ifæ¡ä»¶ãçµã¿èŸŒãŸããŠããããïŒ16è¡ç®ïŒãåã®ãã§ãã¯ã倱æããïŒæåã®ãã©ã¡ãŒã¿ãŒãIPv4ã¢ãã¬ã¹ã§ã¯ãªãïŒå Žåãããã°ã©ã ã¯ãã®ã»ã¯ã·ã§ã³ã«å°éããŸããã
ãã®ãµãã¿ã¹ã¯ïŒIPv4ã¢ãã¬ã¹ã®æžç®ïŒã®è§£æ±ºçã¯ãåå ã®2ã€ã®æ°å€ãæžç®ãããã®ããã«è¡ãããŸãã
192.168.3ã 1 -192.168.2ã 10 = 0. 0.0.247
ãã¡ããããããã®æ°å€ã¯10é²æ°ã§ã¯ãããŸãããã256ã«åºã¥ããŠããŸããã€ãŸããåã®æ°åã®å€ã䜿çšããå Žåããªã¯ãããã®16é²è¡šèšã§10ã§ã¯ãªã256ïŒ0x100ïŒãè¿œå ããå¿ èŠããããŸãã
0xC0.0xA8.0x03.0x01 -0xC0.0xA8.0x02.0x0A ----------------------ïŒããŒã³ãå®è¡ããäžçŽã¬ãã«ãããŠããããåé€ããŸãïŒ = 0xC0.0xA8.0x03.0x01 -.0x01 ----------------------ïŒããŒã³ãç¶ç¶ããçµæãæ°å€ã·ã¹ãã ã®ããŒã¹ã®å€ã§èª¿æŽããŸãïŒ -0xC0.0xA8.0x02.0x00A + .0x100 ----------------------ïŒçµæã¯ãã®ãããªæäœã§ãïŒ = 0xC0.0xA8.0x02.0x101 -0xC0.0xA8.0x02.0x00A = 0x00.0x00.0x00.0x0F7
ãããå®è£ ããã«ã¯ãæåã®ãã©ã¡ãŒã¿ãŒãšåæ§ã«ã otcfipãªã¹ããäœæããŠããããªã¯ããããšãŒãã®éããå«ãoctsubå€æ°ãäœæããŸããcountipã¯ãå ¥åããIPv4ã¢ãã¬ã¹ã§ã¯ãªããã¢ãã¬ã¹ãªã¹ãã®ãµã€ãºãæ ŒçŽããŸããã®ã³ãŒããããã¯ã
3ã0ã®éé ã§å€æ°iã䜿çšããŠforã«ãŒããç·šæããŸãããã®ã«ãŒãã§ã¯ãIPv4ã¢ãã¬ã¹ã®ãã¹ãŠã®ãªã¯ããããæäžäœããéå§ããå¿ èŠããããŸã ã ã€ãŸã ã octsipããã³octfipãªã¹ãã®ãã¹ãŠã®èŠçŽ ãæåŸã®èŠçŽ ããéå§ããŸã ã
çŸåšã®ãªã¯ãããoctfip-octcipã®å·®ãèšç®ãã octsubã«ä¿åããŸã ã ããã§é åã䜿çšãããã£ãã®ã¯ã lindexã䜿çšããæ§ç¯ãéåžžã«é¢åã§ããããã§ããããªã¹ãããé åïŒTCLã§ã¯çµåã®ã¿ïŒã圢æããç°¡åãªæ¹æ³ãèŠåœãããããªã¹ãã®ã¿ãã©ãã«ã§ããããŸãã èšç®ãããå·®ã¯ã0æªæºã®æ¡ä»¶ã§ããã«ãã§ãã¯ãããŸããã€ãŸããé«ãªã¯ãããããããŒã³ãäœæããå¿ èŠããããã©ããã
èè³ãè¡ãå¿ èŠãããããããæãå€ããªã¯ãããã§ã¯ãªãå ŽåïŒ i㯠0ãã倧ããïŒã256ãå·®octsubã«è¿œå ãããã¯ãªã¡ã³ããããïŒ octfip ïŒã®æ¬¡ã®ãªã¯ããããã1ãåŒããŸãã
ãããæãå€ããªã¯ãããã§ããå Žåãæžå°ããoctfipã¯æžç®ãããoctsipããå°ãã ãã€ãŸããå·®ã¯è² ã§ããããšãå€æããŸããããã¯åé¡ã®æ¡ä»¶ã«ãããã®ã§ã¯ãªãããã®å Žåã¯ã«ãŒããçµäºããŸã-break
ããªããèè³ãããå¿ èŠããªãå Žåãçµæã¯ç§ãã¡ãæºè¶³ãããŸãã ãã ããçµæã¯ãããã®å Žåã256ãåºæ°ãšããæ°å€ã·ã¹ãã ã§è¡šç€ºãããŸããããã¯ãã€ã³ã¿ãŒããªã¿ãŒãç解ããã·ã¹ãã ã§ããã«èšç®ãè¡ãå¿ èŠãããããã䟿å©ã§ã¯ãããŸããã ãããã£ãŠãçµæã®çµæãäœçœ®çªå·ã·ã¹ãã ã®æšæºçãªæ¹æ³ã§å€æããŸãã
... + A i * B i ... + A 3 * B 3 + A 2 * B 2 + A 1 * B 1 + A 0 * B 0 = N B ãããã§Bã¯çªå·äœç³»ã®åºæ°ã§ãã
ç§ãã¡ã®å ŽåïŒ countip = octsub ni * 256 ni ãããã§niã¯0ãã3ãŸã§ããŸãã¯ni = 3- i ãããã§iã¯3ãã0ã«å€ãããŸããããã«ãããæ¢åã®ãµã€ã¯ã«ã«å€æãå«ããããšãã§ããŸãã æ°å€ã·ã¹ãã ã®åºæ°ã¯2ã®åæ°ã§ããããã次æ°ãèšç®ããããã«ã8ã®åæ°ã®ã·ããã䜿çšããŸããããã¯ã256ããã€ããªè¡šçŸã§100000000ã§ããããã§ããã€ãŸãããŠãããã¯å·Šã«8ãããã·ãããããŸãã ãããã£ãŠãæåã«0ã次ã«8ïŒã³ãŒãã®ãã®ã»ã¯ã·ã§ã³ã®æåŸã®æå¹ãªè¡ïŒã次ã«16ããã³24ãã€ã·ããããŠã1ïŒ256 0 ïŒã256ã256 2ããã³256 3ãä¹ç®ããŸãã
ãã®ãµã€ãã«2床ç®ã«æ»ã£ããšããããã¯å®è£ äžã«åçŽã§ç解ããããããã«æãããåœæãåŒãèµ·ãããŸããããä»ã§ã¯äžå¿ èŠã«æ··ä¹±ãè€éã«ãªã£ãŠããŸãã ããã¯ããã®ã³ãŒãã説æããããã¹ãã®éã«ãã£ãŠãå€æã§ããŸãã
äœãæªãã®ïŒ ãªããåã³ïŒãæžç®ãè¡ãå¿ èŠããã£ãã®ã§ããïŒåºæ°ã256ã®æ°å€ã·ã¹ãã ã§ã¯ãããããããã®å€ãããã°ã©ãã³ã°èšèªãç解ã§ããæ°å€åœ¢åŒã«å€æããç¹ã«ç¿»èš³ãè¡ãããã«æšæºçãªæ段ã䜿çšããŠæžç®ãã代ããã«ã çµå±ãç§ã«ãšã£ãŠã¯ã人éã®äž»èŠ³çãªèªèãåã³æ®é ·ãªåè«ãæŒãããšããçµè«ã«éããŸããã æåã®ã¯ã©ã¹ã§è¡ãããåã®ã¢ã¯ã·ã§ã³ãå®è¡ãããããç°¡åãªããšã¯äœã§ããïŒ äœããªããããã¯å®éã®æ°åã®åŸã«èª°ããæåã«æããããããã ã 翻蚳ãã·ããã¯ãæåã®ã¯ã©ã¹ã®æãåçŽãªæäœãšæ¯èŒããŠãè€éã«èŠããŸãã ããã10é²æ°ã·ã¹ãã ã§ã¯ãªãããšãç解ããã®ã¯å°ãåŸã«ãªããŸãããèšè¿°ãããã³ãŒããããäžåºŠèŠãªããã°ãªããªãã£ããšãã«ã®ã¿äœãèµ·ãã£ãŠããã®ããç解ããããšã§ãã ãã®çµæãåããµã€ãã®2çªç®ã®ããŒãžã§ã³ã
Ver.2ãNo.18-25
if {[regexp $exip $countip]} then { set octfip [split $countip {.}] set nfip [expr ([lindex $octfip 0] * 0x1000000) + ([lindex $octfip 1] * 0x10000)\ + ([lindex $octfip 2] * 0x100) + ([lindex $octfip 3])] set nsip [expr ([lindex $octsip 0] * 0x1000000) + ([lindex $octsip 1] * 0x10000)\ + ([lindex $octsip 2] * 0x100) + ([lindex $octsip 3])] if {$nfip >= $nsip} then {set countip [expr $nfip - $nsip]} }
ïŒæåã®ããŒãžã§ã³ã®ããã«ïŒ octfipãªã¹ããäœæããåŸã2çªç®ã®åŒæ°ã®ã¢ãã¬ã¹ã®nfipå€æ°ãš1çªç®ã®åŒæ°ã®ã¢ãã¬ã¹ã®nsipå€æ°ã«ãIPv4ã¢ãã¬ã¹å€ã«å¯Ÿå¿ããçªå·ãäœæããŸãã ãµã€ã¯ã«ãªãã§å€æãè¡ããå€ã1è¡ã«çœ®ãæããŸãïŒ nfip = listitem 0 * 256 3 + listitem 1 * 256 2 + listitem 2 * 256 + listitem 3 ãããã§listitem nã¯å¯Ÿå¿ãããªã¹ãèŠçŽ ã§ãlindexã䜿çšããŠåŒã§çŽæ¥ã ã³ãŒãã®256ã¯ãããããããããããã«ã16é²æ°å€0x100xxxxã®åœ¢åŒã§ããçšåºŠè¡šçŸãããŠããŸãã 次ã«ã2çªç®ã®åŒæ°ãæåã®åŒæ°ããã倧ããããšã確èªããæåã®åŒæ°ã2çªç®ã®åŒæ°ããæžç®ããŠãçµæã®å€ãcountipã«ä¿åããŸãã
ãã®çµæã以åãããå°ãç°¡åã«ãªããããã«ç°¡åã«ãªããŸããã ãã®ãªãã·ã§ã³ã«æ©ãŸãããã®ã¯ã exprèšç®ã§nfipå€æ°ãšnsipå€æ°ããªãŒããŒãããŒããå¯èœæ§ãããããšã ãã§ãã çŸåšã®Cã³ã³ãã€ã©ã®å Žåãããã¯æãããããšã§ã¯ãããŸããã èšç®ããã³ãªãŒããŒãããŒã«é¢ããããã¥ã¡ã³ãhttp://www.tcl.tk/man/tcl8.5/TclCmd/expr.htm#M23ãã ã ããŒãžã§ã³8.4 www.tcl.tk/man/tcl8.4/TclCmd/expr.htm#M5ã®å Žå ãæ°å€å®æ°ã¯32ãããã®ç¬Šå·ä»ãæ°å€ã§ããããšãæ瀺çã«è¿°ã¹ãããŠããããã®èšè¿°ã®ããŒãžã§ã³8.5ã§ã¯ãå¿ èŠã«å¿ããŠ64ãããã®ç¬Šå·ä»ãæ°å€ãšããŠè§£éãããŸããã åã®ããŒãžã§ã³ã§ã¯ããªãŒããŒãããŒã®ä»®æ³çãªå¯èœæ§ãååšããŠããŸãããããã§ã«ååŸããå·®ãåŠçããŸããããå®éã®å Žåã¯16ãããæ°ãããã¯ããã«å°ãããªããŸãã
次ã«ããŠãŒãã£ãªãã£ã®2çªç®ã®éšåãéå§ãããIPv4ã¢ãã¬ã¹ã®åºåãªã¹ãã圢æãããŸãã
Ver.2ãNo.26-27
if {[regexp $exdg $countip]} then { puts $startip
countipå€æ°ã0ã999999ã®æ°å€ã«æºæ ããŠãããã©ããã確èªããŸãããã®å€æ°ã®å€ã¯ã2çªç®ã®åŒæ°ã§æž¡ãããšãã§ããŸããã€ãŸããIPv4ã¢ãã¬ã¹ã«å±ããŠãããã©ããã®ä»¥åã®ç¢ºèªã«å€±æããŸããã ãŸãã¯ãåŒæ°ã§æå®ãããã¢ãã¬ã¹éã§ãã§ã«èšç®ãããå·®ã ãã®å€æ°ã®å€ã倧ããããå ŽåããŸãã¯æ°å€ã«ãŸã£ãã察å¿ããŠããªãå ŽåïŒããšãã°ãIPv4ã¢ãã¬ã¹ã®å·®ãè² ã®å Žåãããã¯èšç®åŸã®å¯èœæ§ããããŸãïŒããã以éã®åŠçã¯å®è¡ãããŸããã ãã¹ãŠãæ£åžžãªå Žåããªã¹ãã®æåã®èŠçŽ ïŒæåã®åŒæ°ã§æå®ãããIPv4ã¢ãã¬ã¹ïŒã衚瀺ããŸãã ããã«ãIPv4ã¢ãã¬ã¹ã®çµæãªã¹ããã·ãŒã±ã³ã¹ãšåŒã³ãTCLã®å éšæŠå¿µã§ãããªã¹ããšæ··åããªãããã«ããŸãã
Ver.2ãNo.28-29
for {set i 0} {$i<$countip} {incr i 1} { set octsip [lreplace $octsip {3} {3} [expr [lindex $octsip {3}] + 1]]
ç®çã®ã·ãŒã±ã³ã¹ã®æ®ãã®èŠçŽ ã圢æããŸããããã¯ãé åã䜿çšãããã®ã§ããããªã¹ãããé åãžã®å€æã¯ããã®åœ¢åŒã®ãªã¹ãã䜿çšãããããæªãããã§ãïŒãããæ£ããç°¡åã«è¡ãã«ã¯ã©ãããã°ããã§ããïŒïŒã 0ããcountipã·ãŒã±ã³ã¹ã®èšç®ãããïŒãŸãã¯æå®ãããïŒæ倧èŠçŽ ãŸã§ã®å€ãå®è¡ããå€æ°iã® forã«ãŒãã次ã«ç€ºããŸãã ã«ãŒãå ã§ã¯ã以åã«åœ¢æãããoctsipãªã¹ãã®æåŸã®èŠçŽ ïŒã¢ãã¬ã¹ã®æäžäœã®ãªã¯ãããïŒã1å¢å ããŸã...
Ver.2ãNo.30-36
for {set j 3} {$j>=0} {incr j -1} { if {[lindex $octsip $j] > 255 && $j > 0} then { set sj [expr $j - 1] set octsip [lreplace $octsip $j $j {0}] set octsip [lreplace $octsip $sj $sj [expr [lindex $octsip $sj] + 1]] } }
...ãããŠãä»ã®ã«ããŽãªã調æŽããå¿ èŠããããã©ããã確èªããŸãã ãã®ãã ãå€æ°jã®å®è¡å€ã3ãã0ã®forã«ãŒããç·šæããŸãã次ã«ãifæ¡ä»¶ã§ãçŸåšã®ãªã¯ãããã255ãè¶ ããŠããïŒãªãŒããŒãããŒãçºçããŠããïŒããšã確èªããŸããããã¯0ãè¶ ããªãã0ã§ã¯ãªãæé«ãªã¯ãããjã§ãã ãçŸåšã®ãªã¯ãããã¯ãŒãã«ãªããé«ãªã¯ãããïŒå é ã«è¿ããªã¯ã·ãããªã¹ãé ç®ã«å¯Ÿå¿ïŒã§1ãè¿œå ããŸããé«ãªã¯ãããã§ãªãŒããŒãããŒãçºçããå ŽåãIPv4ã¢ãã¬ã¹ãééã£ãŠããããã«èª¿æŽããŸããã
Ver.2ãNoã37-44
set oip [join $octsip {.}] if {[regexp $exip $oip]} then { puts $oip } else { puts ": " exit 3 } }
ã¢ãã¬ã¹ã®ãªã¯ããããå«ãçµæãªã¹ããããŒãžããã»ãã¬ãŒã¿ãããªãªãã§ããoipå€æ°ã«çµåããŸãã 次ã«ãæåã«æå®ããæ£èŠè¡šçŸã䜿çšããŠãIPv4ã¢ãã¬ã¹ã«å±ããçµæã確èªããŸãã ãã¹ãŠãæ£ããå Žå-æ£ãããªãå ŽåããªãŒããŒãããŒãçºçããããå¥ã®ãšã©ãŒããã§ã«ã·ãŒã±ã³ã¹ã®åœ¢æããã»ã¹ã«ãããšæšæž¬ããexit exit emergencyãçµäºããŸã ã ãŸãããã®æç¹ã¯å®å šã«çŸããããã§ã¯ãããŸãããè€æ°ã®çµäºãã€ã³ãããããããããšãã°ãæåŸã«åãã¢ã¯ã·ã§ã³ãå®è¡ãããå Žåã«äžäŸ¿ã«ãªãå¯èœæ§ããããŸãã
æåŸã®éãæ¬åŒ§ã¯forã«ãŒãã®çµããã§ããããã¯åºåã·ãŒã±ã³ã¹ã圢æãã28è¡ç®ã§éããŸãã
Verã2ãNoã45-51
} else { puts " \"$getcountip\"" } } else { puts " IP \"$startip\"" } }
26è¡ãš16è¡ã®æ¡ä»¶ã§elseãã©ã³ãã«ãšã©ãŒã¡ãã»ãŒãžã衚瀺ããæåŸã®è¡ã§ã¯ãããã°ã©ã ã®èµ·åæã«æå®ãããåŒæ°ãæåŸ ã©ãããã©ããã確èªããŸãã ããã¯getcountipå€æ°ã䜿çšãããå¯äžã®å Žæã§ãããããã°ã©ã ã®2çªç®ã«åãåã£ãåŒæ°ãå€æŽãããŠããªã圢åŒã§æ ŒçŽããŸããããã¯å¥åŠã§ããéããšæãããŸããããã®å ŽåãæçœãªïŒåçŽãªïŒä»ã®ãªãã·ã§ã³ãå®è£ ããããšã¯äžå¯èœã§ããã
ããã°ã©ã ã®ãã®éšåãããäžåºŠèŠãŠïŒåºåã®ã·ãŒã±ã³ã¹ã圢æãããïŒãæåã«ãããŒã¹ãã³ããŒã·ã¹ãã 256ã«4æ¡ã®æ°åã®å šå ç®åšãšãåãæ°åã®è¿œå ã³ãŒãã«ãã©ã³ã¹ã¬ãŒã¿ãŒãå®è£ ãããšãããšæããŸããåãå ç®åšã§ã®æžç®ã æåã®éšåã¯ãŸã å€æŽããŠããããåã®èšç®ã®åçŽãã«ã€ããŠã®ã¢ã€ãã¢ã«æ¯é ãããŠããŸããã ãã®ïŒéçã®ïŒãã³ãã£ãŒãå®è£ ããããšããé¡æã¯ãããèªäœã¯èå³æ·±ããã®ã§ããããå€åTCLã§ã¯å®çŸããªãã£ããããæåããŸããã§ããã 2çªç®ã®éšåãæåã®éšåãšåãããã«ãã€ãŸãéåžžã®è¡šçŸããå¿ èŠãªãã®ã«å€æããããã«å€æŽããå¿ èŠãããããšã¯æ¢ã«æããã§ããïŒããã¯æ¢ã«256æ¡ã®æ°å€ã·ã¹ãã ãžã®å€æã§ãïŒã
forã«ãŒãã§èšèªæ段ã䜿çšããŠIPv4ã¢ãã¬ã¹ãå埩åŠçã§ããå Žåã¯ãåæã®æŠå¿µãå€æŽãããŠããŸãããã®ã·ãŒã±ã³ã¹ã®ãµã€ãºãäºåã«èšç®ããªãã®ã§ããã°ãåçŽã«è¡ã®ã¢ãã¬ã¹ããå¥ã®ã¢ãã¬ã¹ã«ç§»åããŸãã ãŸãããã®ã¢ãããŒãã§ã¯ãå°ããæ¹ãã倧ããæ¹ãžã ãã§ãªãå察æ¹åã«ã移åããã®ã¯éåžžã«ç°¡åã§ããããšãå€æããŸãã-ããã¯è¿œå ã®åªåãå¿ èŠãšããããã®åœ¢æäžã«ã«ãŒãå€æ°ã®å¢åãæ£ããèšå®ããå¿ èŠããããŸãïŒããã§è¿œå ã®æ©èœãå¯èœã§ãä»»æã®æ¹åã®ã·ãŒã±ã³ã¹ã圢æããŸãïŒã
Ver.3ãNo.31-32
if {$nfip > $minip && $nfip < $maxip} then { if {[set d [expr $nfip >= $nsip]]} then {set di {1}} else {set di {-1}}
nfipã®æææš©ã確èªããŸããnfipã«ã¯ã2çªç®ã®åŒæ°IPv4ã¢ãã¬ã¹ãç¯å²ã«æå®ãããçªå·ãšããŠå«ãŸããŠããŸãïŒ minipãšmaxipã¯ããã°ã©ã ã®éå§æã«æ±ºå®ãããŸãïŒã ç¯å²å ã«åãŸãå Žåã2çªç®ã®IPv4ã¢ãã¬ã¹nfipãæåã®nsipããã倧ããå ŽåïŒã¢ãã¬ã¹ã¯ãã§ã«æ°åã®åœ¢åŒã«ãªã£ãŠããïŒãç¹°ãè¿ãã®æ¹åãèšå®ããçŽæ¥é åºã®ç¹°ãè¿ãã¯å€æ°di = 1ãããããå°ããå Žåãéã®é åºã®ç¹°ãè¿ãã di = -1ã æ¯èŒã®çµæãdã«èšæ¶ãããŸãã
Ver.3ãNoã33-37
for {set i $nsip} {($i<=$nfip && $d) || ($i>=$nfip && !$d)} {incr i $di} { set octip [list [expr ($i & 0xFF000000) >> 24] [expr ($i & 0xFF0000) >> 16]\ [expr ($i & 0xFF00) >> 8] [expr ($i & 0xFF)]] puts [join $octip {.}] }
åæå€ãnsipã«èšå®ãããŠããå€æ°iã§forã«ãŒããæŽçããçµäºæ¡ä»¶ãæ¡ä»¶nfip> = nsipã§èª¿æŽããŸããçµæã¯d ïŒ i <= nfip㧠ãäžããnfipã«è¿ã¥ãå ŽåããŸãã¯i> = nfipã«æ ŒçŽããŸãã å¢åiã¯ãã§ã«èšç®ããã diã«æ ŒçŽãããŠããŸãã
ã«ãŒãã®æ¬äœã§ã¯ãIPv4ã¢ãã¬ã¹ã®ãªã¯ãããã®ãªã¯ããããªã¹ããäœæããŸãã ã€ãŸããã¢ãã¬ã¹ããã®æ°å€è¡šçŸãã10é²è¡šèšã§åœ¢æããå¿ èŠããããŸã-256 10é²æ°ã·ã¹ãã ã«å€æããŸãã äžè¬çãªå Žåãçè«ã«åŸã£ãŠãå¥ã®çªå·ã·ã¹ãã ã«åºã¥ããŠã1ã€ã®çªå·ã·ã¹ãã ã«çªå·ãåå²ããå¿ èŠããããŸãããŸããæ®åºããæ°ããçªå·ã·ã¹ãã ã«çªå·ã圢æããŸãïŒããã«åºã¥ããŠåå²ããŸãïŒã
3 221 225 985 | 256 -3 221 225 984 | ----------- -------------- | 12,582,914 | 256 1 | -12,582,912 | ------- ---------- | 49 152 | 256 2 | -49 152 | --- 0 | 192
çµæ192ããéå§ããŠã0ã2ã1ã®éé ã®ãã¹ãŠã®æ®åºã«å¯ŸããŠ192.0.2.1ãåŸãããŸãã é€ç®ã¯è€éãªæäœã§ãããæé©åã¯è¡ãããŸããããéåžžã«ç¹æ®ãªã±ãŒã¹ã§ã¯ãIPv4ã¢ãã¬ã¹ãš256ã«ããé€ç®-ãã¹ãŠãéåžžã«åçŽã«ãªããŸãã 8ã§ã·ãããïŒ256ã®çŽ¯ä¹ã§é€ç®ïŒãäžèŠãªãããããã¹ã¯ããŸãïŒ2é æŒç®ãANDãïŒã 16é²åœ¢åŒã§æ³åããŠãã ããã
0xC0000201 | 0xC0000201 | 0xC0000201 | 0xC0000201 ïŒ0xFF000000 | ïŒ0x00FF0000 | ïŒ0x0000FF00 | ïŒ0x000000FF -------------------------------------------------- ------------------- 0xC0000000 >> 24 | 0x00000000 >> 16 | 0x00000200 >> 8 | 0x00000001 -------------------------------------------------- ------------------- = 0xC0ïŒ192ïŒ| = 0x00ïŒ0ïŒ| = 0x02ïŒ2ïŒ| = 0x01ïŒ1ïŒ
ããã¯ãã¹ãŠ1è¡ã§è¡ãããåãããã¯ç¬èªã®ãªã¹ãèŠçŽ listã«é 眮ãããŸã ã ã«ãŒãã®æ¬æã®2çªç®ã®ã¹ããŒãã¡ã³ãã¯ãçµåããããªã¹ãã衚瀺ããŸãã
Ver.3ãNoã38-45
} else { puts " IP " exit 3 } } else { puts " IP \"$startip\"" } }
æåŸã®è¡ã¯ã»ãšãã©å€ãããŸãããããã«ã2çªç®ã®åŒæ°ãèšå®ããéã®ãšã©ãŒã«é¢ããçµè«ã¯ãããã°ã©ã å ã§ãããã«é«ãã·ããããŸãã ããã°ã©ã ã®æåã®éšåã¯ã2çªç®ã®ãªãã·ã§ã³ãšæ¯èŒããŠå°ãå€æŽãããŠããŸãã
Ver.3ãNoã1-7
#!/usr/bin/tclsh8.5 set exip {^(2(5[0-5]|[0-4]\d)|1\d{2}|[1-9]\d{0,1})(\.(2(5[0-5]|[0-4]\d)|1\d{2}|[1-9]\d|\d)){3}$} set exdg {^-?(0?|([1-9]\d*))$} set maxip {0xFFFFFFFF} set minip {0xFFFFFF}
æ°å€ãã©ã¡ãŒã¿ãŒããã§ãã¯ããããã®æ£èŠè¡šçŸã¯ãä»»æã®é·ãã®æ°å€ã«å¯ŸããŠæ£ã®çããè¿ãããã«ãªããŸãããå é ã«0ã¯ãããŸããããè² ç¬Šå·ã-ããåã«ä»ããŠããŸãã ããã§ã¯ã次ã®å€æ°maxipããã³minipã䜿çšããŠãçµæã®ã·ãŒã±ã³ã¹ã®é·ããæ°å€åœ¢åŒã§ãã§ãã¯ãããããããã§ãã¯ãç°¡ç¥åããå¢çãæ¡åŒµããŸãã ããããã®å€ã¯ãexipæ£èŠè¡šçŸãè€è£œããŸãããããã¯ãèšç®çµæã§ã¯ãªãããŠãŒã¶ãŒå ¥åã®æ£ç¢ºæ§ã®ã¿ããã§ãã¯ããããã«ãªã£ãããã§ãã
Ver.3ãNo.15-20
set startip [lindex $argv 0] if {![string length [set finiship [lindex $argv 1]]]} then {set finiship {0}} if {[regexp $exip $startip]} then { set octsip [split $startip {.}] set nsip [expr ([lindex $octsip 0] * 0x1000000) + ([lindex $octsip 1] * 0x10000)\ + ([lindex $octsip 2] * 0x100) + ([lindex $octsip 3])]
è¡8ã14ã¯ãæåã®ãªãã·ã§ã³ã®è¡6ã12ãã»ãŒå®å šã«ç¹°ãè¿ããŸãããæ°ããæ©èœã«å¿ããŠã¡ãã»ãŒãžããããã«ä¿®æ£ããŸããã次ã«ã2çªç®ã®ãªãã·ã§ã³ãšã»ãŒåãã¢ã¯ã·ã§ã³ãå®è¡ããŸãã2çªç®ã®åŒæ°ãæå®ãããŠããªãå Žåãå€æ°ãåžžã«å®çŸ©ãããããã«ãfinishipå€ã匷å¶çã«0ã«èšå®ããå¯äžã®ãã®ã§ããfinishipã¯2çªç®ã®ãªãã·ã§ã³ã®countipãšåãæå³ãæã¡ãæ°ããæŠå¿µã«åãããŠååãå€æŽãããŸãããæçµçã«ããã®å€æ°ã«ã¯IPv4ã¢ãã¬ã¹ã®ã·ãŒã±ã³ã¹ã®ãµã€ãºã¯å«ãŸããŸãããããã®ã·ãŒã±ã³ã¹ã®æåŸã®ã¢ãã¬ã¹ãå«ãŸããŸããæåã®åŒæ°ãæ§æèŠçŽ ã«å解ããçŽåŸã«nsipãèšç®ããŸãã
Ver.3ãNo.21-30
if {[regexp $exip $finiship]} then { set octfip [split $finiship {.}] set nfip [expr ([lindex $octfip 0] * 0x1000000) + ([lindex $octfip 1] * 0x10000)\ + ([lindex $octfip 2] * 0x100) + ([lindex $octfip 3])] } elseif {[regexp $exdg $finiship] && [expr abs($finiship)] < $maxip} then { set nfip [expr $nsip + $finiship] } else { puts " \"$finiship\"" exit 5 }
æåã®æ¡ä»¶ã¯ã2çªç®ã®ãªãã·ã§ã³ãšåãã§ããåè¿°ã®å€æŽ-æåã®åŒæ°ã®èšç®ãã³ãŒãå ã§å°ãé«ããªããŸããã
2çªç®ã®elseifæ¡ä»¶ã¯ã2çªç®ã®åŒæ°ãæ°å€ã«æºæ ããŠãããã©ããããã§ãã¯ããããšã§ãããã®ãã§ãã¯ã¯ãæåã®å Žåã®ããã«ãããã®å Žåãå®è¡ãããŸããããã ãã2çªç®ã®åŒæ°ãIPv4ã¢ãã¬ã¹ã§ãªãå Žåã®ã¿ã§ããæ°å€ã®å Žåãnfipã¯ããã®æ°å€ãšnsipãåèšããŠèšç®ãããŸããåä¿¡ããIPv4ã¢ãã¬ã¹ã®æ£åœæ§ã®æ€èšŒã¯ãã³ãŒãã®ããã«äžã§æ°å€çã«è¡ãããŸãïŒäžèšã®ãšããïŒã
2çªç®ã®åŒæ°ãçªå·ã«ãIPv4ã¢ãã¬ã¹ã«ãäžèŽããªãå Žåãexitãäžæ¢ããŸããç¹°ãè¿ããŸãããå€æ°ã®åºå£ç¹ãååŸããŸããããã®ããŒãžã§ã³ã§ã¯3ã€ã®åºå£ç¹ããããŸããããã䜿çšãããšãç¡éã«ãŒãã«ããã°ã©ã å šäœãå ãããšã§å æããå¿ èŠã§ããã°ã圌ã®äžæã§ããäŒæ©ãããã°ã©ã ã®æåŸã«ãªã£ãŠãããã絶察çã«å¿ èŠã¯ãããŸããã§ããããããŸããåè¿°ã®ããã«ããã¹ãŠã®ãšã©ãŒãã§ãã¯ã¯ãããã©ã«ãã¢ã¯ã·ã§ã³ã«çœ®ãæããããšã§é€å€ã§ããŸããããã¯ãã³ãã³ãã¢ãŒãã«ããé©ããŠããŸãããã®ãªãã·ã§ã³ã§ã¯ãgetcountipå€æ°ã¯ãããŸããããšã©ãŒã¡ãã»ãŒãžã«ã¯çŽæ¥åä¿¡ãã2çªç®ã®finishipåŒæ°ãå«ãŸããŸããããã¯å€æŽãããªããããäœæ¥äžã«ã®ã¿äœ¿çšãããããã§ãã
ãŠãŒãã£ãªãã£ïŒcipl.tlïŒã®ããžãã¯ãæ¡åŒµãããéå§ããIPv4ã¢ãã¬ã¹ã¯çµäºããIPv4ã¢ãã¬ã¹ãããå°ããããå¿ èŠããªããªãããªã¹ãã¯æåãã2çªç®ãŸã§äœæãããŸãã2çªç®ã®ãã©ã¡ãŒã¿ãŒãè² ã®æ°ã«èšå®ããããšãã§ããŸãããã®å Žåããªã¹ãã¯éã®é åºã«ãªããŸãã
> cipl.tl 192.0.2.1 -1 192.0.2.1 192.0.2.0 > cipl.tl 192.0.2.1 192.0.2.0 192.0.2.1 192.0.2.0
ããã¯ãã¹ãŠã®äžéã§ããã説æã¯ã³ãŒãèªäœã倧ããäžåããå ã®Varantã®ç¶æ³å šäœã¯ãããã¯habrahabr.ru/blogs/complete_code/135340ã®ç¢ºèªã§ãããæçµçã«ã¯ã7å枬å®ããŠ1åã«ããããšããããã«ãããã»ã©æªãã¯ãããŸããã§ããããã©ã¹å®çšãŠãŒãã£ãªãã£ã
å®å šãªããã°ã©ã ã§ã®ãªãã·ã§ã³ïŒcipl.zip
åºæ°ã«ã€ããŠã¯ããŠã£ãããã¯ã¹ã§èªãããšãã§ããŸã- ru.wikibooks.org/wiki/Sistemy_schisleniya
ããªãã¯TCLã«ã€ããŠç¥ãå¿ èŠããããã¹ãŠã¯äžã§www.tcl.tk/docãšwiki.tcl.tk