移动函数 - Pascal 到 PHP

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

日安

相信一切都好。

我想把Pascal中的Move函数复制到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的相同结果,以便使用类似DB的相同加密字段。

我认为这是在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

任何帮助都将是非常感激的。

先谢谢你。

php delphi pascal
1个回答
1
投票

Pascal代码将一些AnsiChars移动到32位的Int变量中。注意,第一个字符变成了整数中最不重要的字节(由于字节顺序的关系),而结果就等于

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

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

如果你能把字符串的第一个符号 $pass 在PHP中作为byteint变量 - 工作完成。

P.S. 我看到 ord() 函数,所以代码可能是这样的。 (我还把%改成了bitwise &)

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];
© www.soinside.com 2019 - 2024. All rights reserved.