Python ctypes.c_int到Perl XS(或非XS)转换(Javascript签名的32位移位运算符转换) 背景
我们需要将Javascript哈希算法转换为Perl代码。因此,我们需要将Javascript的按位移位运算符和>>>转换为Perl。到目前为止,我们已经有了进行转换的算法,但是由于Javascript按位移位运算符对32位整数进行操作,因此我们还需要在Perl中对此进行模拟 Python解决方案 基于这篇文章,我们了解到我们可以使用ctypes在Python中实现这一点。例如,要将整数左移x位:Python ctypes.c_int到Perl XS(或非XS)转换(Javascript签名的32位移位运算符转换) 背景,javascript,python,perl,bitwise-operators,Javascript,Python,Perl,Bitwise Operators,我们需要将Javascript哈希算法转换为Perl代码。因此,我们需要将Javascript的按位移位运算符和>>>转换为Perl。到目前为止,我们已经有了进行转换的算法,但是由于Javascript按位移位运算符对32位整数进行操作,因此我们还需要在Perl中对此进行模拟 Python解决方案 基于这篇文章,我们了解到我们可以使用ctypes在Python中实现这一点。例如,要将整数左移x位: import ctypes print (ctypes.c_int(integer <<
import ctypes
print (ctypes.c_int(integer << x ^ 0).value)
导入ctypes
在JS中打印(ctypes.c#u int(整数<代码>子lshr32{($\[0]&0xFFFFFFFF)>>>$\[1]}
JS中的子lshl32{($\[0]子lshr32{($\[0]&0xFFFFFFFF)>>$\[1]}}
sub lshl32{($u[0]将结果截断为32位难道还不够吗?如在中使用常量{I32=>0xffff\u ffff}。。。($x您能给我们看一下JavaScript哈希代码吗?@melpomene谢谢您的建议,但这行不通。我们已经尝试过一些类似的实现。较大的整数在移位后可能会溢出32位边界,因此简单地截断结果并不总是给出正确的答案。其他一些类似的解决方案已在中给出Python解决方案也是如此,但从测试来看,每次都有效的唯一解决方案是使用ctypes.c_into。您的团队中是否有人编写c?然后您可以使用或@DiabJeriusInline::c
看起来会行得通。它还附带了一本食谱:谢谢您的建议。我稍后会尝试一下。这样做是否足够将结果截断为32位?如使用常量{I32=>0xffff\u ffff}。。。($x您能给我们看一下JavaScript哈希代码吗?@melpomene谢谢您的建议,但这行不通。我们已经尝试过一些类似的实现。较大的整数在移位后可能会溢出32位边界,因此简单地截断结果并不总是给出正确的答案。其他一些类似的解决方案已在中给出Python解决方案也是如此,但从测试来看,每次都有效的唯一解决方案是使用ctypes的解决方案。c_Int您的团队中有人编写c吗?然后您可以使用或@DiabJeriusInline::c
看起来会起作用。它还附带了一本食谱:谢谢您的建议。我稍后会尝试一下。这样做没有意义将负数传递到逻辑移位,但是>
的行为似乎是为负数定义的。您只需转换输入,我已将其添加到我的LSHR32中。您的更改只会使子项更复杂,而不会更改输出。int
的大小必须适应-32767..32767。它可以小于32位。它可以大于32位。什么情况?正数和负数?它已经处理了这两种情况。同样,您的添加实际上没有任何效果。我们终于理解了您的解释。因为您将lshr32
和lshl32
集中在JS
注释中的>下,我们认为它们需要用于组合。我们最初测试负数,并从lshr32
得到了一个好结果,因此我们错误地认为lshl32
是正数实现。我们缺乏技术知识,导致我们感到困惑,遗憾的是,给您带来了挫折。很抱歉让您觉得这个问题很无聊。Tha再次感谢您宝贵的帮助和时间。将负数传递给逻辑移位没有意义,但是>
的行为似乎是为负数定义的。您只需强制转换输入,我已将其添加到我的LSHR32中。您的更改只会使子项更加复杂,而不会更改的输出大小int
必须容纳-32767..32767。它可以小于32位。它可以大于32位。什么情况?正数和负数?它已经处理了这两种情况。同样,你的加法实际上没有效果。我们终于理解了你的解释。因为你把lshr32
和lshl32
放在一起JS
评论中的#>>我们认为它们需要结合使用。我们最初测试负数,从lshr32
中得到了很好的结果,所以我们错误地认为lshl32
是正数实现。我们缺乏技术知识导致了我们的困惑,遗憾的是,导致你很沮丧。很抱歉让这个问题让你感到乏味。再次感谢你宝贵的帮助和时间。
sub lshr32 { ( $_[0] & 0xFFFFFFFF ) >> $_[1] } # >>> in JS
sub lshl32 { ( $_[0] << $_[1] ) & 0xFFFFFFFF }
sub ashr32 { ( $_[0] - ( $_[0] % ( 1 << $_[1] ) ) ) / ( 1 << $_[1] ) } # >> in JS
sub ashl32 { unpack "l", pack "l", $_[0] * ( 1 << $_[1] ) } # << in JS