2014-01-30 64 views
1

我想將字符串轉換爲數字以便在中使用SCP命令。有人可以幫忙嗎?在tcl中將IP地址轉換爲數字

set ip "192.168.1.2" 
scp:[email protected]$ip//etc/dev/ 

它不會用我設置的IP替換$ip

如何將IP轉換爲編號,因爲scp命令需要的是數字而不是字符串。

謝謝

回答

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:[email protected]$ip//etc/dev/

回想一下,Tcl對這命令,如command word ...,並有在 「SCP」 命令中沒有空格,所以TCL將嘗試找到一個名爲「scp:[email protected]//etc/dev/」的命令 - 我打賭它找不到一個。

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