【问题标题】:Move Function - Pascal to PHP移动函数 - Pascal 到 PHP
【发布时间】:2020-05-25 07:45:11
【问题描述】:

早安,

相信一切都会好的。

我想将 Move 函数从 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 中移动的相同结果,以便使用来自类似数据库的相同加密字段。

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

任何帮助将不胜感激。

提前谢谢你。

【问题讨论】:

  • 奇怪的代码,至少可以这么说。我希望你永远不要使用超过 4 个字符的字符串来调用 Encode()

标签: php delphi pascal


【解决方案1】:

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

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

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

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

附:我看到 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];

【讨论】:

  • 你甚至不需要打电话给str_split()。您可以直接从字符串中访问字符。
  • @MBo,非常感谢你,这个 mod 似乎可以工作,现在 shr 部分似乎需要不同的解决方案,我看到我忘了将它添加到原始问题中。地图[(字节(S[1]) shr 10) mod 64] 地图[(i shr 10) mod 64]
  • @Olivier,谢谢,我现在看到了,节省了一点内存。
  • 不,几位。
  • Byte(S[1]) shr 10 不是真正的代码,因为字节右移 10 总是给出 0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多