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

ego*_*ulz 2 binary 64-bit tcl decimal

我正在尝试将64位二进制字符串值()转换为整数,但显然达到了tcl限制并得到:

integer value too large to represent
Run Code Online (Sandbox Code Playgroud)

二进制字符串:

000000000000101000000000000010100000000000000100
Run Code Online (Sandbox Code Playgroud)

我用来从二进制转换为整数的proc是:

  proc binary2decimal {bin} {
     binary scan [binary format B64 [format %064d $bin]] I dec
     return $dec
  }
Run Code Online (Sandbox Code Playgroud)

我尝试使用64进行格式化,也尝试使用LI无济于事。我读到有关“宽”字的信息,但不知道是否可以在这里应用。

PS:我正在使用tcl 8.4

Don*_*ows 6

首先,错误来自format,默认情况下对64位数字不满意(出于向后兼容的原因),但实际上我们正在其中处理一串字符,因此%064ss,not d)是一个合适的解决方案。

您真的应该切换到使用Tcl 8.5,因为它容易:

binary scan [binary format B64 [format "%064s" $bin]] W dec
Run Code Online (Sandbox Code Playgroud)

甚至只是:

set dec [expr "0b$bin"]
Run Code Online (Sandbox Code Playgroud)

在8.4中,您必须做更多的工作,因为对64位的支持要原始得多。

binary scan [binary format B64 [format %064s $bin]] II d1 d2
set dec [expr {wide($d1)<<32 | wide($d2)}]
Run Code Online (Sandbox Code Playgroud)

这一点不太明显,但是该I格式已经并且一直被记录为只能与32位值一起使用。因此,我们在扫描后将两个(大端)半值缝合在一起。