我正在尝试使用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
有人可以建议我改进适用于所有情况的代码吗?
答案 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