誰かが perl で作成した crypt 関数を php コードに変換するタスクがあります。これを除いて、すべて正常に動作します:
パール:
$wert = Encode::encode( "utf8", $wert );
$len=length $wert;
$pad = ($len % 16)?"0".chr(16 - ($len % 16)):"10";
$fuell = pack( "H*", $pad x (16 - $len % 16));
PHP:
$wert = utf8_encode($wert);
$len = mb_strlen($wert);
$pad = ( $len%16 ) ? '0'.chr(16 - ($len%16)) : '10';
$fuell = pack("H*", str_repeat($pad, (16 - $len % 16)));
一部の文字列では、php バージョンは問題なく動作します。しかし、「2010-01-01T00:00:00.000」のようなものがある場合、perl バージョンはエラーなしで動作し、php バージョンは「PHP 警告: pack(): タイプ H: 不正な 16 進数」を出力します。
誰かがphpバージョンのエラーを見つけることができれば、私は非常に感謝しています.
編集:
これは、php に変換する完全な関数です。もう私たちとは仕事をしていない会社のプログラマーによって作成されたので、当初の意図が何であったかはよくわかりません。
sub crypt
{
my $self = shift;
my ($wert,$pw)= @_;
$wert = Encode::encode( "utf8", $wert );
$pw = Encode::encode( "utf8", $pw );
$len=length $wert;
$pad = ($len % 16)?"0".chr(16 - ($len % 16)):"10";
$fuell = pack( "H*", $pad x (16 - $len % 16));
$wert=$wert.$fuell;
$lenpw=length $pw;
$fuell = ($lenpw % 16)? pack ("H*", "00" x (16 - $lenpw % 16)):"";
$pw=$pw.$fuell;
$cipher = new Crypt::Rijndael $pw, Crypt::Rijndael::MODE_CBC;
$cipher->set_iv($pw);
$crypted = encode_base64($cipher->encrypt($wert),"");
return $crypted;
}