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

问题描述 投票:0回答:1

背景

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

Potkhon Solyuion

基于这篇文章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中调用它。性能不是真正的问题,因此这种“黑客”是可以接受的,尽管有点不受欢迎。换句话说,我们更愿意仅在Perl中维护整个程序(由几个模块组成)。

javascript python perl bitwise-operators
1个回答
5
投票
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来为自己创造了很多额外的工作,因为你正在重新创建用于解决Perl中不存在的JavaScript限制的hacks。使用32位无符号值,使用<<截断的& 0xFFFFFFFF和使用>>截断的& 0xFFFFFFFF应该更简单。

© www.soinside.com 2019 - 2024. All rights reserved.