Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ctypes.c_int到Perl XS(或非XS)转换(Javascript签名的32位移位运算符转换) 背景_Javascript_Python_Perl_Bitwise Operators - Fatal编程技术网

Python ctypes.c_int到Perl XS(或非XS)转换(Javascript签名的32位移位运算符转换) 背景

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 <<

我们需要将Javascript哈希算法转换为Perl代码。因此,我们需要将Javascript的按位移位运算符和>>>转换为Perl。到目前为止,我们已经有了进行转换的算法,但是由于Javascript按位移位运算符对32位整数进行操作,因此我们还需要在Perl中对此进行模拟

Python解决方案 基于这篇文章,我们了解到我们可以使用ctypes在Python中实现这一点。例如,要将整数左移x位:

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?然后您可以使用或@DiabJerius
Inline::c
看起来会行得通。它还附带了一本食谱:谢谢您的建议。我稍后会尝试一下。这样做是否足够将结果截断为32位?如
使用常量{I32=>0xffff\u ffff}。。。($x您能给我们看一下JavaScript哈希代码吗?@melpomene谢谢您的建议,但这行不通。我们已经尝试过一些类似的实现。较大的整数在移位后可能会溢出32位边界,因此简单地截断结果并不总是给出正确的答案。其他一些类似的解决方案已在中给出Python解决方案也是如此,但从测试来看,每次都有效的唯一解决方案是使用ctypes的解决方案。c_Int您的团队中有人编写c吗?然后您可以使用或@DiabJerius
Inline::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