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
首先,错误来自format,默认情况下对64位数字不满意(出于向后兼容的原因),但实际上我们正在其中处理一串字符,因此%064s(s,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位值一起使用。因此,我们在扫描后将两个(大端)半值缝合在一起。