Tcl 函数
- 判断输入的字符是不是数字
- 十进制转二进制
- 二进制转十进制
- 根据子网掩码得出子网掩码长度
- 根据子网掩码长度算出子网掩码
- 根据IP地址和子网掩码长度,输出子网网段
- Demo 结果
1.判断输入的字符是不是数字
proc Digit {d} {
if {[string is digit $d]} {
return 1
} else {
return 0
}
}
2.十进制转二进制
proc DecToBin {dec} {
set bin ""
while {$dec!=0} {
set bin "[expr $dec%2]$bin"
set dec [expr $dec/2]
}
return $bin
}
3.二进制转十进制
proc BinToDec {bin} {
set sum 0
set len [string length $bin]
for {set i 0} {$i<$len} {incr i} {
incr sum [expr int([string index $bin $i]*pow(2,$len-$i-1))]
}
return $sum
}
4.根据子网掩码得出子网掩码长度
proc Mask_len {mask} {
set mask [split $mask .]
set len 0
for {set i 0} {$i<4} {incr i} {
set m [lindex $mask $i]
set str [Decimal $m]
incr len [string length [string trim $str 0]]
}
return $len
}
5.根据子网掩码长度算出子网掩码
proc LengthToMask {len} {
set mask ""
for {set i 0} {$i < $len} {incr i} {
append mask 1
}
set zeros [string repeat 0 [expr 32-[string length $mask]]]
set mask $mask$zeros
set bin1 [string range $mask 0 7]
set bin2 [string range $mask 8 15]
set bin3 [string range $mask 16 23]
set bin4 [string range $mask 24 31]
set mask [BinToDec $bin1].[BinToDec $bin2].[BinToDec $bin3].[BinToDec $bin4]
return $mask
}
6.根据IP地址和子网掩码长度,输出子网网段
proc get_network_segment {ip_addr mask_len} {
set mask_code [LengthToMask $mask_len]
set input [list $ip_addr $mask_code]
set input_bin(0) ""
set input_bin(1) ""
for {set j 0} {$j<2} {incr j} {
set a [split [lindex $input $j] .]
for {set i 0} {$i<4} {incr i} {
set bin($i) [DecToBin [lindex $a $i]]
set zeros [string repeat 0 [expr 8-[string length $bin($i)]]]
set bin($i) [join [lappend zeros "" $bin($i)] ""]
if {$j==0} {
set input_bin(0) [join [append input_bin(0) $bin($i) ] ""]
} else {
set input_bin(1) [join [append input_bin(1) $bin($i)] ""]
}
}
}
set network_segment_bin ""
for {set i 0} {$i<32} {incr i} {
set segment_bin [expr [string index $input_bin(0) $i] & [string index $input_bin(1) $i]]
set network_segment_bin [join [append network_segment_bin $segment_bin] ""]
}
set bin1 [string range $network_segment_bin 0 7]
set bin2 [string range $network_segment_bin 8 15]
set bin3 [string range $network_segment_bin 16 23]
set bin4 [string range $network_segment_bin 24 31]
set network_segment [BinToDec $bin1].[BinToDec $bin2].[BinToDec $bin3].[BinToDec $bin4]
return $network_segment
}
Demo结果