如何使用TCL将ipv4地址转换为ipv6地址

how to convert ipv4 to ipv6 address using TCL

给定任何 ipv4 IP 地址(例如:10.24.13.91),应将其转换为 ipv6 地址(预期输出:::FFFF:0A18:0D5B) 如何编写将任何 ipv4 地址转换为 ipv6 地址的 TCL 脚本,如上所示。?

ip package in Tcllib is helpful here, but doesn't do the whole job. (You're after making an IPv4-mapped IPv6 address, as defined in RFC 3513.)

package require ip

proc IPv4toIPv6 {addr} {
    if {![ip::is ipv4 $addr]} {
        error "need an IPv4 address"
    }
    set raw [ip::toInteger $addr]
    return [ip::normalize [format "::FFFF:%04x:%04x" [expr {$raw >> 16}] [expr {$raw & 0xFFFF}]]]
}

set v6 [IPv4toIPv6 10.24.13.91]
puts "Full address: $v6"
# Full address: 0000:0000:0000:0000:0000:ffff:0a18:0d5b
puts "Abbreviated: [ip::contract $v6]"
# Abbreviated: ::ffff:a18:d5b

我觉得很合适。

   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]
    }

只是一种解决方法。上述逻辑将按预期适用于任何 Ipv4 ip。 !!!!