如何使用tcl将大十六进制数(例如0x111111112222222233333333)拆分为32位数字列表(0x11111111 0x22222222 0x33333333)?
答案 0 :(得分:1)
Tcl中的算法基于你处理任意长度的数字的想法(实现使用各种内部表示,但你应该不太了解它)。这意味着我们在算术上进行转换。此外,它有助于以相反的顺序提取数字,如果我们知道该数字是无符号的。
proc extractIntegers {number {bits 32}} {
set accumulator {}
set mask [expr {(1 << $bits) - 1}]
while {$number != 0} {
set value [expr {$number & $mask}]
set number [expr {$number >> $bits}]
lappend accumulator [format "%#x" $value]
}
return [lreverse $accumulator]
}
puts [extractIntegers 0x111111112222222233333333]
答案 1 :(得分:0)
为了处理Donal注意到的“无限位”情况,我们可以使proc递归。至少那时,解释器最终将达到其最大递归深度和错误。
proc extractIntegersRecursive {number {bits 32} {mask 0}} {
if {$number == 0} return
if {$bits <= 0} {error "invalid bits"}
set mask [expr {$mask ? $mask : (1 << $bits) - 1}]
set procname [lindex [info level 0] 0]
return [concat \
[$procname [expr {$number >> $bits}] $bits $mask] \
[format %#x [expr {$number & $mask}]] \
]
}