"Paketi" ile yardıma ihtiyacı

2 Cevap php

Php koduna perl'de yapılan bir crypt fonksiyonunun birisi dönüştürmek görevi var. Her şey bu hariç çalışmaları tamam:

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 sürümü bazı dizeleri için çalışmaları tamam. Ama '2010-01-01T00 gibi bir şey olduğunda: 00:00.000 'perl sürümü herhangi bir hata olmadan çalışır ve php sürümünü yazdırır "PHP Warning: pack (): H Tipi: yasadışı Hex haneli".

Birisi php sürümünde hata nokta eğer ben çok minnettarım.

Edit:

Bu benim php dönüştürmek için var tam fonksiyonudur. Gerçekten özgün niyeti neydi anlatamam yani o artık bizim için çalışmıyor bir şirketin bir programcı tarafından yapılmıştır.

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;
}

2 Cevap

Hata both sürümlerinde aslında gibi görünüyor. Biçim kodu H, bir hex rakam arar, ve PHP hata belirtildiği gibi, bu bir (yasal) bulgu değildir. Suçlu bu ifadesi gibi görünüyor:

chr(16 - ($len % 16))

Paketinin Perl sürümü ne olursa olsun, bir altıgen haneli (ne istediğiniz olmayabilir olan) olup olmadığını karakterini dönüştürmek çünkü Perl sürümü şikayetçi değildir. documentation gerçekte ne olduğu hakkında daha ayrıntılı gider.

Hatayı önlemek için, bunun yerine bu deneyin:

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

Bu alıyorsanız hatayı düzeltmek gerekir iken ben Perl kodu orijinal yazarın kesin niyetini bilmiyorum çünkü bu kabul edilebilir bir çözüm ise Note:, bilmiyorum.

Bunun Perl uygulanması pack() giriş dizesi geçersiz onaltılık basamak hoşgörülü olduğu görünüyor, ve PHP sürüm kesinlikle değildir.

Düşünün:

print pack("H*", "ZZ");

Bu (nedense) Perl baskılar 3, ancak PHP belirtilen hatayla sonuçlanır.

Perl bu 'basamak' ile yaptığını tam olarak emin değilim, ama kesinlikle PHP gibi aynı değil.

EDIT: görünüyor ileri bir karakter setine Perl aslında "rulo" olacak Hex haneli etki gibi. Yani:

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ  #-- Give this to Perl...
0123456789ABCDEF0123456789ABCDEF0123  #-- .. and it's treated as this hex digit

Böylece, "ZZ" it 3 baskılar neden "33" ile aynıdır. Bu davranış not well-defined belgelerine göre olduğunu unutmayın. Iyi tanımlanmış değildir davranışına dayanır beri Böylece Perl, orijinal uygulama, adamcağız kabul edilebilir.