日安
相信一切都好。
我想把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
任何帮助都将是非常感激的。
先谢谢你。
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];