gpt4 book ai didi

php - 需要 "pack"的帮助,用于 perl 和 php

转载 作者:可可西里 更新时间:2023-10-31 23:59:48 27 4
gpt4 key购买 nike

我的任务是将某人用 perl 编写的 crypt 函数转换为 php 代码。一切正常,除了这个:

Perl:

$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 Warning: pack(): Type H: illegal hex digit”。

如果有人能发现 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;
}

最佳答案

看起来错误实际上在两个 版本中。格式代码 H 查找十六进制数字,如 PHP 错误中所述,它没有找到(合法的)数字。罪魁祸首似乎是这个表达:

chr(16 - ($len % 16))

Perl 版本没有问题,因为 Perl 的 pack 版本会转换字符,不管它是否是十六进制数字(这可能不是您想要的)。 documentation详细了解实际发生的情况。

为防止错误,请尝试以下操作:

sprintf('%x', 16 - ($len % 16))

注意:虽然这应该可以解决您收到的错误,但我不知道这是否是一个可接受的解决方案,因为我不知道 Perl 代码的原始作者的确切意图。

关于php - 需要 "pack"的帮助,用于 perl 和 php,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1784457/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com