Python Z3py-做一个滚动
有没有一种推荐的方法可以按任意数量向左或向右进行位滚动 例如,使用字节-Python Z3py-做一个滚动,python,z3,smt,Python,Z3,Smt,有没有一种推荐的方法可以按任意数量向左或向右进行位滚动 例如,使用字节-0x57 rolr 3=0xEA 我在Z3py文档中没有发现任何“滚动”操作。我曾考虑对每一位使用BitVecs,但这似乎没有效率/可能不会起作用。谢谢你的建议 编辑:谢谢你的回答。这更像是一个API问题,因为我现在很烂。这是我的出发点 def roll(bt): count = BitVecVal(int('0x03', 16), 8) s.add(bt == (bt << count | bt >>
0x57 rolr 3=0xEA
我在Z3py文档中没有发现任何“滚动”操作。我曾考虑对每一位使用BitVec
s,但这似乎没有效率/可能不会起作用。谢谢你的建议
编辑:谢谢你的回答。这更像是一个API问题,因为我现在很烂。这是我的出发点
def roll(bt):
count = BitVecVal(int('0x03', 16), 8)
s.add(bt == (bt << count | bt >> (8 - count)) & 0xFF)
a = BitVec('a', 8)
s = Solver()
roll(a)
s.add(a == BitVecVal(int('0xEA', 16), 8))
s.check()
def辊(bt):
计数=位向量值(int('0x03',16),8)
s、 添加(bt==(bt>(8-计数))&0xFF)
a=比特向量('a',8)
s=解算器()
滚动(a)
s、 add(a==BitVecVal(int('0xEA',16),8))
s、 检查()
这不会打印任何内容,并且模型不可用。您可以执行如下旋转:
size = 0x100 # size of the bitvector
rotated = (x << n) | (x >> (size - n)) & (size - 1)
size=0x100#位向量的大小
旋转=(x>(大小-n))和(大小-1)
与?>
不同的是算术移位。这就是它不起作用的原因。下面是一个带有示例的链接:顺便说一句,Z3Py具有以下功能:RotateLeft
和RotateRight
。py模块有一堆pydoc注释。这是doxygen制作的在线API参考指南:@LeonardoeMoura此代码没有打印任何内容,是否有错误a=BitVec('a',8)
s=Solver()
s.add(RotateLeft(a,3)==BitVecVal(int('0xEA',16),8))
s.check()
s.model()
您必须添加print
。下面是您的打印示例链接:Eric,您的解决方案几乎是正确的。问题在于,Z3Py中的
是算术移位。对于逻辑移位,我们必须使用函数LShR
。我们可以在网上@LeonardoeMoura尝试一下:因此在最后是&(size-1)
。尝试我在回答中所写的:@LeonardodeMoura:事实上,我不知道这段代码为什么有效。如果设置了x的最高位,那么(x>>(size-n))
不会用1s填充所有高位吗?埃里克:没错,(x>>(size-n))
会用1s填充高位。这就是为什么我说这是不正确的。我们可以通过使用(1@LeonardodeMoura:我不知道我在想什么。当我写(size-1)
时,我的意思是(1