需要帮助“打包”for perl和php
发布时间:2020-12-16 06:08:52 所属栏目:大数据 来源:网络整理
导读:我的任务是将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
我的任务是将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:非法十六进制数字”. 如果有人能够发现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代码原始作者的确切意图. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |