首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python ctypes.c_int到Perl XS (或非XS)的转换(Javascript带符号的32位移位运算符转换)

Python ctypes.c_int到Perl XS (或非XS)的转换(Javascript带符号的32位移位运算符转换)
EN

Stack Overflow用户
提问于 2018-09-17 19:10:26
回答 1查看 131关注 0票数 0

背景

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

Python解决方案

基于这篇文章https://stackoverflow.com/a/41610348,我们了解到我们可以使用ctype在Python中做到这一点。例如,要将整数左移x位:

代码语言:javascript
复制
import ctypes
print (ctypes.c_int(integer << x ^ 0).value)

Perl问题

我的理解是我们需要使用XS来做这件事。我的问题是,是否有人有一个快速的解决方案来实现它。我们不知道XS。我们可以开始学习它,但从我的印象来看,学习曲线相当高,可能需要一段时间才能掌握它。当然,如果存在非XS解决方案,那么它将是理想的。任何解决方案或提示都将不胜感激。

解决方法

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-17 23:58:05

代码语言:javascript
复制
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中不存在的限制的hack。使用32位无符号值、使用& 0xFFFFFFFF截断<<和使用& 0xFFFFFFFF截断>>应该简单得多。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52366418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档