如何将64位二进制字符串转换为tcl中的十进制数?

时间:2013-11-27 18:35:00

标签: binary 64-bit tcl decimal

我正在尝试将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

1 个答案:

答案 0 :(得分:6)

首先,错误来自format,默认情况下对64位数字并不满意(出于向后兼容性原因),但我们确实使用了一串这里的字符,%064ss,而非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位值。因此,我们在扫描后将两个(大端)半值拼接在一起。