将IP地址转换为tcl中的数字

时间:2014-01-30 13:20:59

标签: tcl ip-address

我想将字符串转换为数字,以便在 SCP 命令中使用。有人可以帮忙吗?

set ip "192.168.1.2"
scp:root@$ip//etc/dev/

它不会用我设置的IP替换$ip

如何将IP转换为数字,因为scp命令需要数字而不是字符串。

由于

2 个答案:

答案 0 :(得分:1)

你需要一个库来做到这一点。 tcllibIP address manipulation module

package require ip
set ip "192.168.1.2"
set num [ip::toInteger $ip]
puts $num
puts [ip::intToString $num]
-1062731518
192.168.1.2

这看起来很奇怪:scp:root@$ip//etc/dev/

回想一下,Tcl评估command word ...之类的命令,并且“scp”命令中没有空格,因此Tcl将尝试查找名为“scp:root@192.168.1.2//etc/dev/”的命令 - 我打赌它找不到一个。

答案 1 :(得分:1)

这不是将任何字符串转换为数字,而是转换为IP地址。在Tcl 大多数中,所有内容都是字符串,因此您只需使用expr命令进行数学运算,它将根据需要进行转换。请注意我在expr中的实现中如何简单地引用[lindex $octets $i]这是一个从拆分IP地址派生的字符串,但命令仍按预期运行。

以下是您真正要求的天真实现:将IP地址转换为数字(整数);你想要通过各种验证(段数组的长度,每个段的最小/最大等)来增强它 - 这就是为什么在另一个答案中建议的库可能是更好的方法,更不用说可能是配备处理ipv6,我只是忽略;)

Here's an explanation of the implementation in general;请任何人随意编辑一个更好的。关于我的实现的一个注释:通过反转列表,我将上一个八位字节乘以256 ^ 0,最后一个八位字节乘以256 ^ 1等等,将权力乘以lindex。

set ip "192.168.1.2"
set ip_as_int 0
set octets [lreverse [split $ip .]]

for {set i 0} {$i < 4} {incr i} {
    set ip_as_int [expr {256 ** $i * [lindex $octets $i] + $ip_as_int}]
}

puts $ip_as_int ;#3232235778