proc str2hex { string } {
set str [binary scan $string H* hex]
puts $hex
regsub -all (..) $hex {\1 } t1
set res [format "%s" $t1 ]
return $res
proc hex2str { $hex } {
puts "HIIHI"
foreach c [split $$hex ""] {
if {![string is xdigit $c]} {
return "#invalid $$hex"
}
}
set hexa [binary format H* $$hex]
return $hexa
}
}
以上是将字符串转换为十六进制的简单代码。我已经进行了嵌套proc,其中将来自“set str [binary scan $string H* hex]
”脚本的十六进制作为输入,以便将十六进制重新转换为字符串.Plz帮助我。
答案 0 :(得分:2)
你通常不应该在Tcl的程序中嵌套程序;它的结果不是你所期待的。目前,Tcl proc
命令几乎不会注意调用它的上下文(除了知道当前命名空间是什么),特别是它不会影响“内部”过程对变量的看法。
更重要的是,proc
是一个普通命令(碰巧创建了另一个命令),实际上必须调用它才能执行任何操作。将它放在程序中唯一的return
之后将保证它根本没有效果。 Tcl非常简单(可预测)。
最后,将$
放在变量名中是不明智的。它是合法的,但访问它的语法很笨拙(在你的情况下,它会是${$hex}
)。
如果你真的想要类似本地程序的东西,可以考虑使用apply
和lambda术语。它们是在Tcl 8.5中引入的。
如果您正在使用Tcl 8.6(现在推荐),那么您可以采用更优雅的方式进行这两项操作:
proc str2hex {string {encoding "utf-8"}} {
binary scan [encoding convertto $encoding $string] cu* bytes
return [lmap value $bytes {format %02x $value}]
}
proc hex2str {hex {encoding "utf-8"}} {
return [encoding convertfrom $encoding [binary format H* [join $hex ""]]]
}
(需要指定编码,否则字节之间没有唯一的映射 - binary scan
和binary format
使用 - 和字符。但我们可以设置合理的默认值。)< / p>