Tcl语言对IP地址和掩码的处理

Tcl 函数

  1. 判断输入的字符是不是数字
  2. 十进制转二进制
  3. 二进制转十进制
  4. 根据子网掩码得出子网掩码长度
  5. 根据子网掩码长度算出子网掩码
  6. 根据IP地址和子网掩码长度,输出子网网段
  7. 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结果

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值