如何在TCL中将MAC地址转换为链路本地IPV6地址

时间:2016-02-08 15:24:03

标签: tcl

我正在尝试使用TCL将MAC地址转换为链接本地IPV6地址。我有一个代码片段,适用于所有基于整数的MAC地址,但不适用于基于十六进制的十六进制,特别是那些以非数字字符开头的代码片段。我目前的代码:

set newmac AC:DE:48:1D:27:6D

lassign $newmac __o1 __o2 __o3 __o4 __o5 __o6

set __o1 [expr $__o1 ^ 0x02]  ;# universal bit flip

set __ip fe80::${__o1}${__o2}:${__o3}ff:fe${__o4}:${__o5}${__o6}

位翻转/反转部分对此地址不起作用,因为我认为expr总是需要一个整数,尽管相同的代码适用于其他地址,例如 - 55:12:34:26:21:97

有人可以建议我改进适用于所有情况的代码吗?

1 个答案:

答案 0 :(得分:1)

首先,你拥有的lassign将无效。 我在下面的代码中包含了原始的lassign,所以你可以看到会发生什么。你本来想要的:

lassign [split $newmac :] __o1 __o2 __o3 __o4 __o5 __o6

实现你想要的。 expr期望您完全正确 整数。使用scan命令扫描字符串中的十六进制值。 然后使用format转换回十六进制。

set newmac AC:DE:48:1D:27:6D
lassign $newmac __o1 __o2 __o3 __o4 __o5 __o6
puts "$__o1 - $__o2 - $__o3 - $__o4 - $__o5 - $__o6"
scan $newmac {%02x:%02x:%02x:%02x:%02x:%02x} __o1 __o2 __o3 __o4 __o5 __o6
puts "$__o1 $__o2 $__o3 $__o4 $__o5 $__o6"
set __o1 [expr $__o1 ^ 0x02] ;# universal bit flip
set __ip [format {fe80::%02x%02x:%02xff:fe%02x:%02x%02x} \
    $__o1 $__o2 $__o3 $__o4 $__o5 $__o6]
puts "$__ip"

输出:

AC:DE:48:1D:27:6D -  -  -  -  - 
172 222 72 29 39 109
fe80::aede:48ff:fe1d:276d