繁体   English   中英

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

[英]Python ctypes.c_int to Perl XS (or non-XS) conversion (Javascript signed 32-bit bitwise shift operator conversion)

背景

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

Python解决方案

根据这篇帖子https://stackoverflow.com/a/41610348,我们了解到可以使用ctypes在Python中完成此操作。 例如,要将整数左移x位:

import ctypes
print (ctypes.c_int(integer << x ^ 0).value)

Perl问题

我的理解是,我们需要使用XS来做到这一点。 我的问题是,是否有人可以快速实施该解决方案。 我们不知道XS。 我们可以开始学习它,但是从我的印象中,学习曲线相当高,可能需要一段时间才能精通它。 当然,如果有的话,非XS解决方案将是理想的。 任何解决方案或提示将不胜感激。

解决方法

由于我们已经有了Python解决方案,因此可以在Python中实现此模块,然后从Perl中调用它。 性能并不是真正的问题,因此这种“ hack”是可以接受的,尽管有些不可取。 换句话说,我们宁愿只在Perl中维护整个程序(由几个模块组成)。

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

除非数字不是真正的数字而是位的集合,否则将负数传递给逻辑移位是没有意义的。 假设您要移植哈希算法,则很有可能。 这也意味着您将通过紧密匹配JavaScript来为自己创建很多额外的工作,因为您正在重新创建用于解决JavaScript限制(在Perl中不存在)的黑客。 它应该是简单得多,使用32位无符号值, <<用截断& 0xFFFFFFFF ,并且>>截断使用& 0xFFFFFFFF

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM