首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >位操作的PHP等价物NodeJs脚本

问位操作的PHP等价物NodeJs脚本
EN

Stack Overflow用户
提问于 2020-04-08 23:43:45
回答 1查看 68关注 0票数 0

我正在尝试将一个非常简单的函数从NodeJs转换为PHP。我想我找到了如何转换80%的代码,但是我被位运算符卡住了。

这是原始的NodeJs脚本:

代码语言:javascript
复制
function convert(encodedString) {
  let bytes = new Buffer.from(encodedString, 'base64')
  let code = bytes[bytes.length - 1]
  code ^= 91

  for (let i = 0; i < bytes.length - 1; ++i) {
    bytes[i] = ((bytes[i] ^ (code << (i % 5))) | 0)
  }

  return bytes
}

这是转换后的PHP版本

代码语言:javascript
复制
function convert($encoded)
{
    $bytes = unpack('C*', base64_decode($encoded));
    $code = $bytes[count($bytes)];
    $code ^= 91;

    for($i = 0; $i < count($bytes) - 1; ++$i) {
        $bytes[$i + 1] = (($bytes[$i + 1] ^ ($code << ($i % 5))) | 0);
    }  

    return $bytes;
}

这以某种方式工作,直到按位部分。我得到了数组第一个元素的正确结果,但所有后续值都是错误的。我还必须调整索引,因为使用unpack方法可以得到一个基数为1的索引数组。

如果我在转换前循环每个数组的值,我会在两个脚本上得到相同的结果,所以我认为在此之前是正确的。

我能够在NodeJs上重现这个问题,例如,如果我定义了一个普通数组(具有相同的值),而不是使用Buffer。

我真的不知道如何在PHP中重现同样的行为。

如有任何帮助,我们不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2020-04-09 00:18:36

Javascript和PHP中的位运算符处理计算的方式不同。

示例:

Javascript:

代码语言:javascript
复制
1085 << 24 = 1023410176

PHP:

代码语言:javascript
复制
1085 << 24 = 18203279360

Bitwise operations PHP and JS different

您应该在PHP中编写自己的位运算符函数。What is JavaScript's highest integer value that a number can go to without losing precision?

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

https://stackoverflow.com/questions/61104638

复制
相关文章

相似问题

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