我正在尝试将 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 无济于事。我读到有关“宽”的内容,但不明白它是否可以在这里应用。
附言:我使用的是 tcl 8.4
最佳答案
首先,错误来自 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 位值。所以我们在扫描后将两个(大端)半值拼接在一起。
关于binary - 如何将 64 位二进制字符串转换为 tcl 中的十进制数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20250378/