将大十六进制数拆分为TCL中的32位数字列表

时间:2017-07-14 14:36:46

标签: hex tcl

如何使用tcl将大十六进制数(例如0x111111112222222233333333)拆分为32位数字列表(0x11111111 0x22222222 0x33333333)?

2 个答案:

答案 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}]] \ 
    ] 
}