Python 为什么z3方程失败了?
我需要解这个代码(C中的代码) 这是我的python脚本Python 为什么z3方程失败了?,python,z3,z3py,Python,Z3,Z3py,我需要解这个代码(C中的代码) 这是我的python脚本 from z3 import * len_input_serial = BitVec("serial_len",64) solve(LShR(LShR(0xAAAAAAAAAAAAAAABL * len_input_serial,64),1) + len_input_serial - 3 * LShR(LShR(0xAAAAAAAAAAAAAAABL * len_input_serial,64),1) == 14) 然而,这给了我[se
from z3 import *
len_input_serial = BitVec("serial_len",64)
solve(LShR(LShR(0xAAAAAAAAAAAAAAABL * len_input_serial,64),1) + len_input_serial - 3 * LShR(LShR(0xAAAAAAAAAAAAAAABL * len_input_serial,64),1) == 14)
然而,这给了我[serial\u len=14]
我知道解决方案应该在[42,38,40]
左右,那么这里出了什么问题 这个表达式:
(0xAAAAAAAAAAAAAAABLL * len_input_serial >> 64) >> 1
始终等于0
。如果将64位量右移64位,则得到0。(请注意,您使用的是LShr
,它将其输入视为无符号量。)
因此,整个过程简化为求解len\u input\u serial==14
,这就是Z3产生的答案
请注意,在Python中编写长整数(即0x123L等)时,将获得无限精度。(见此处:)。在C语言中,您很可能得到64位整数。因此,您的Z3代码实际上是正确的;是Python在这里使用了更高的精度,因此造成了混乱。您的Python代码使用
a…ABL
而不是a…ABL
,这是故意的吗?我想这没关系。。我试着将len_input_serial设置为40,然后用python运行代码,我得到了14,这是正确的数字。什么是“solve?”你是在尝试为len_input_serial
找到一个值,以便if
语句的测试结果为true?不,我需要计算false的值,我知道是40,38,42
(0xAAAAAAAAAAAAAAABLL * len_input_serial >> 64) >> 1