Bazı onaltılık dize parçası olduğunda ActionScript String MD5 yanlış sonuçlar dönen (yani "abc \ xBF \ x4E")

2 Cevap php

Ben Adobe tarafından oluşturulan MD5 algoritması kullanarak MD5 ActionScript bir dize çalışıyor ve as3corelib parçasıdır duyuyorum. (Http://as3corelib.googlecode.com/svn/trunk/src/com/adobe/crypto/MD5.as).

Ben doğru olduğunu biliyorum php oluşturulan bir MD5 bu karşılaştırma duyuyorum.

Ben "Abcd1234" gibi bir dize söylemek için AS ve PHP kullanarak MD5s oluşturursanız beklendiği gibi ikisi de, eşittir. Benim dize içinde, yani "abcd \ x28 \ xBF x4E \" bazı onaltılık içeriyorsa sorun olduğunu Actionscript ve php gelen MD5s farklı bir değer döndürür.

Şimdi gerçekten garip bir parçasıdır sürece hala bir dize ince ve maçları ne zaman onaltılık bir sayının şeklinde olduğu gibidir:

yani

"abcd\x28\x46" will have matching values from AS's MD5 and php's MD5. While "abcd\x28\xBF" will yyanild different hashes.

Anyone have any ideas? I've tested the php MD5 thoroughly and I know it is correct and the ActionScript is incorrect. I appreciate the help, thanks for reading and I apologize if this was confusing. I'm a noob when it comes to string encoding, representation etc. Thanks, Drew S.

2 Cevap

Büyük olasılıkla, PHP ve ActionScript dizeleri için farklı kodlamalar kullanıyor; bir olasılıkla ISO-8859-1 kullanıyor ve diğer UTF-8 kullanıyor.

abcd\x28\xBF için, değerler şunlardır:

  • fcfebaeb81afe401c4b608dc684ad08f, ISO-8859-1 altında
  • 47ef883a009ddbe01711ece0a0a8764e UTF-8 altında

Ve abcd\x28\xBF\x4E (diğer örneğin) için, değerler şunlardır:

  • ea382d63efca32d8d7861a314a6112e3, ISO-8859-1 altında
  • dc11cdbaa05aa41640a821fb8e290eae UTF-8 altında

Sizin ikinci sorun tamponlar sonlandırıldı yaygın NUL (veya sıfır) olarak tanımlanan dizeleri kaynaklanmaktadır.

Bir çözüm olsa da, var. iso-8859-1 (NUL karakter dahil) 256 olası karakterleri tanımlar. UTF ilk 256 kod noktaları (UTF-8, UTF-16, vb kullanırsanız kodlama farklı olabilir, ancak codepoints bu codepoints enconde nasıl aynı regarless olan) iso-8859-1 olarak aynıdır.

Eğer (bu latin1 beri) sizin dize codepoints tüm 0-255 aralığında olacağını biliyorum ve bunu gömülü NULs var ok biliyorum Yani, el, her char kodlaması altında olsun, senin dize üzerinde yineleme yapabilirsiniz ve tampon bir byte olarak saklayın. Böyle bir şey:

var s:String = "abc\x00d\x28\xBF";
var buffer:ByteArray = new ByteArray();
var len:int = s.length;
for(var i:int = 0; i < len; i++) {
    buffer.writeByte(s.charCodeAt(i));
}

//  trace it
buffer.position = 0;
while(buffer.bytesAvailable) {
    trace("0x" + buffer.readUnsignedByte().toString(16));
}