如何使用TCL将ipv4地址转换为ipv6地址
给定任何ipv4 Ip地址(例如:10.24.13.91),应将其转换为ipv6地址(预期输出:::FFFF:0A18:0D5B) 如何编写将任何ipv4地址转换为上述ipv6地址的TCL脚本 在这方面是有帮助的,但不能完成全部工作。(您正在创建IPv4映射的IPv6地址,如中所定义。) 看起来很对。如何使用TCL将ipv4地址转换为ipv6地址,tcl,Tcl,给定任何ipv4 Ip地址(例如:10.24.13.91),应将其转换为ipv6地址(预期输出:::FFFF:0A18:0D5B) 如何编写将任何ipv4地址转换为上述ipv6地址的TCL脚本 在这方面是有帮助的,但不能完成全部工作。(您正在创建IPv4映射的IPv6地址,如中所定义。) 看起来很对。proc IPv4toIPv6{addr}{ proc IPv4toIPv6 { addr } { if {![ip::is ipv4 $addr]} {
proc IPv4toIPv6{addr}{
proc IPv4toIPv6 { addr } {
if {![ip::is ipv4 $addr]} {
error "addr should be an IPv4 address"
}
set raw 0
set octets [lreverse [split $addr .]]
for { set i 0 } { $i < 4 } { incr i } {
set raw [expr { 256 ** $i * [lindex $octets $i ] + $raw }]
}
set ipv6 [ip::normalize [format "::FFFF:%04x:%04x" [expr {$raw >> 16}] [expr {$raw & 0xFFFF}]]]
return [ip::contract $ipv6]
}
如果{![ip::是ipv4$addr]}{
错误“addr应该是IPv4地址”
}
将原始值设为0
设置八位字节[lreverse[split$addr.]]
对于{set i 0}{$i<4}{incr i}{
set raw[expr{256**$i*[lindex$octets$i]+$raw}]
}
设置ipv6[ip::normalize[format]::FFFF:%04x:%04x“[expr{$raw>>16}][expr{$raw&0xFFFF}]]
返回[ip::合同$ipv6]
}
只是一个变通办法。上述逻辑将按预期适用于任何Ipv4 IP 非常感谢@Donal的友好回复。让我试着执行它。对于像255.255.0.0这样的IP,逻辑将不起作用
proc IPv4toIPv6 { addr } {
if {![ip::is ipv4 $addr]} {
error "addr should be an IPv4 address"
}
set raw 0
set octets [lreverse [split $addr .]]
for { set i 0 } { $i < 4 } { incr i } {
set raw [expr { 256 ** $i * [lindex $octets $i ] + $raw }]
}
set ipv6 [ip::normalize [format "::FFFF:%04x:%04x" [expr {$raw >> 16}] [expr {$raw & 0xFFFF}]]]
return [ip::contract $ipv6]
}