我正在尝试将64位二进制字符串值()转换为整数,但我显然达到了tcl限制并获得:
integer value too large to represent
二进制字符串:
000000000000101000000000000010100000000000000100
我用来将二进制转换为整数的过程是:
proc binary2decimal {bin} {
binary scan [binary format B64 [format %064d $bin]] I dec
return $dec
}
我尝试使用64格式化,并尝试LI无济于事。我读到“宽”但不明白是否可以在这里应用。
P.S:我正在使用tcl 8.4
答案 0 :(得分:6)
首先,错误来自format
,默认情况下对64位数字并不满意(出于向后兼容性原因),但我们确实使用了一串这里的字符,%064s
(s
,而非d
)是一个合适的解决方案。
你真的应该转而使用Tcl 8.5,这样很多更容易:
binary scan [binary format B64 [format "%064s" $bin]] W dec
甚至只是:
set dec [expr "0b$bin"]
在8.4中,你需要做更多工作,因为64位支持更原始。
binary scan [binary format B64 [format %064s $bin]] II d1 d2
set dec [expr {wide($d1)<<32 | wide($d2)}]
这有点不明显,但I
格式始终被记录为仅使用32位值。因此,我们在扫描后将两个(大端)半值拼接在一起。