当前位置: 首页 > 知识库问答 >
问题:

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

马才
2023-03-14

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

根据这篇文章https://stackoverflow.com/a/41610348,我们了解到我们可以在Python中使用ctypes来实现这一点。例如,将整数左移x位:

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

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

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

共有1个答案

宇文峰
2023-03-14
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截断。

 类似资料:
  • 问题内容: 试图回答另一篇有关其解决方案涉及IP地址和网络掩码的文章时,我陷入了普通的按位算法。 在Python中,是否存在一种标准的方式来进行按位AND,OR,XOR,NOT运算,假设输入是“ 32位”(可能是负数)整数或long,并且结果必须是[[0,2 ** 32]? 换句话说,我需要一个与无符号长整数之间的C按位运算有效的Python对应物。 编辑:具体问题是这样的: 问题答案: 您可以通

  • 问题内容: 为什么按位操作打印-1?在二进制中,不为0应该为1。为什么呢? 问题答案: 你实际上很亲密。 在二进制中,不为0应该为1 是的,当我们谈论一点时,这是绝对正确的。 但是,其值为0实际上是全零的32位!将所有32个零转换为32个零。 这是的补码表示形式。 类似地: 也就是说,对于32位无符号二进制补码表示,。 进一步阅读: 补码 这是Java(以及其他系统)用来表示带符号的数字位的系统

  • 问题内容: 当遇到按位移位运算符时,我遇到了一个有趣的场景。如果第二个操作数为负,按位移位运算如何工作?。 即,<< << b,“ <<”将a中的位模式向左移动b位。但是,如果b为负数,在运行时是否应该出错? 我能够成功运行以下代码,但我不知道它是如何工作的? 输入项 结果 “ a”的ASCII码为97。有人可以帮助我了解其工作原理吗? 问题答案: 但是,如果b为负数,在运行时是否应该出错? 不符

  • 本文向大家介绍JavaScript 按位NOT运算符(〜),包括了JavaScript 按位NOT运算符(〜)的使用技巧和注意事项,需要的朋友参考一下 示例 按位NOT(~)对值中的每个位执行NOT操作。 语法: 返回值: 一个Number。 描述 NOT操作的真值表为: 一种 不是 0 1 1 0 按位不加数字会导致:-(x + 1)。 例子: 值(以10为底) 值(以2为底) 返回(以2为底)

  • GCC和Clang似乎对有符号整数和无符号整数之间的加法有不同的解释,这取决于它们的大小。为什么会这样?所有编译器和平台上的转换是否一致? 举个例子: 结果: 在这两种情况下,我们得到了-1,但其中一个被解释为无符号整数和下溢。我本以为两者都会以同样的方式转化。 那么,为什么编译器会以如此不同的方式转换它们,这保证了一致性吗?我用G11.1.0和Clang12.0测试了这个。以及Arch Linu

  • 问题内容: 我在Redis上使用Lua,想比较两个带符号的64位数字,这些数字存储在两个8字节/字符的字符串中。 如何使用Redis中可用的库进行比较? http://redis.io/commands/EVAL#available- libraries 我想知道并检查。我认为这可能涉及为每个64位int提取两个32位数字,并对它们进行一些巧妙的数学运算,但是我不确定。 我有一些代码可以使这一过程