将函数 - 帕斯卡移动到 PHP

Move Function - Pascal to PHP

美好的一天,

相信一切都好。

我想将移动功能从 Pascal 复制到 PHP。

这是我用 Pascal 编写的:

function Encode(const S: AnsiString): AnsiString;
const
  Map: array [0 .. 63] of Char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +
    'abcdefghijklmnopqrstuvwxyz0123456789+/';
var
  i: LongInt;
begin
  i := 0;     ;
  Move(S[1], i, Length(S));
  Result := Map[i mod 64] + Map[(i shr 6) mod 64];
end;

这是我在 PHP 中的内容:

private function Encode($pass)
    {
        $map = str_split('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/');
        $i = 0;
        $this->MoveFunction($pass[0], $i, mb_strlen($pass));
        $result = $map[$i % 63] . $map[($i >> 6) % 64];
        return $result;
    }

现在我知道Move函数是用来将一段内存从一个地方复制到另一个地方的,只是不知道从哪里开始以及如何完成。我无法在 PHP 中复制 Pascal 的结果。我试过子字符串 ens。无济于事。

“$this->MoveFunction”是我需要编写的函数,以便从 pascal 复制 Move 函数的功能。我需要使用来自 pascal 的 Move 的相同结果,以便使用来自类似数据库的相同加密字段。

我认为这是在 Pascal 中测试的简单方法:

    var
A: array[1..4] of Char;
  B: Integer;
begin
A[1] := 'W';
  A[2] := 'H';
  A[3] := 'A';
  A[4] := 'T';
  B := 5;
  Move(A, B, SizeOf(B));
  showmessage(B.ToString()); // 4718679

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

提前致谢。

Pascal 代码将一些 AnsiChars 移动到 32 位 Int 变量中。请注意,第一个字符成为整数的最低有效字节(由于字节顺序),结果正好等于

Result := Map[Byte(S[1]) mod 64];

所以根本不需要Move,字符串的所有其他符号都不参与工作。

如果您可以将 $pass 的第一个符号转换为 PHP 中的 byte/int 变量 - 工作就完成了。

P.S。我看到 ord() 函数,所以代码可能如下所示:
(我也将 % 改为按位 &)

private function Encode($pass)
    {
        $map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
        $i = ord($pass[0]);
        $result = $map[$i & 63];
        return $result;
    }

对于 shr:

  Result := Map[i mod 64] + Map[(i shr 6) mod 64]; =>

  $a = ord($pass[0]) & 63;
  $b = ord($pass[0]) >> 6;      //two ms bits      

  $b = $b & 3;      //to clear ms bits

  $c = ord($pass[1]) & 15;  //four ls bits  
  $d = $b | ($c << 2);      //combine them
  $result = $map[$a].$map[$d];