![](/img/trans.png)
[英]type conversion perl, javascript, JSON.parse JSON::XS - need ideas
[英]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中进行仿真。
根据这篇帖子https://stackoverflow.com/a/41610348,我们了解到可以使用ctypes在Python中完成此操作。 例如,要将整数左移x位:
import ctypes
print (ctypes.c_int(integer << x ^ 0).value)
我的理解是,我们需要使用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.