Я пытаюсь MD5 строку в ActionScript, используя алгоритм MD5, который был создан Adobe и является частью AS3corelib. ( http://as3corelib.googlecode.com/svn/trunk/src/com/adobe/crypto/MD5.as ).
Я сравниваю это с MD5, созданным в php, который, как я знаю, является правильным.
Если я создаю MD5, используя AS и PHP, например строку abcd1234, они оба равны, как и следовало ожидать. Проблема в том, что когда моя строка содержит в себе шестнадцатеричные символы, то есть «abcd \ x28 \ xBF \ x4E», MD5 из ActionSCript и php возвращают другое значение.
Теперь действительно странная часть до тех пор, пока шестнадцатеричная цифра будет в виде числа, когда ее строка будет хорошо и по-прежнему совпадает:
т.е.
«abcd \ x28 \ x46» будет иметь совпадающие значения из MD5 MD и MD5 MD. Пока «abcd \ x28 \ xBF» будет выдавать разные хэши.
У кого-нибудь есть идеи? Я проверил php MD5 полностью, и я знаю, что это правильно, и ActionScript неверен. Я ценю помощь, спасибо за чтение, и я приношу свои извинения, если это сбивает с толку. Я noob, когда дело доходит до строковой кодировки, представления и т. Д. Спасибо, Дрю С.
Скорее всего, PHP и ActionScript используют разные кодировки для строк; один, вероятно, использует ISO-8859-1, а другой использует UTF-8.
Для abcd\x28\xBF
значения:
fcfebaeb81afe401c4b608dc684ad08f
соответствии с ISO-8859-1 47ef883a009ddbe01711ece0a0a8764e
под UTF-8 И для abcd\x28\xBF\x4E
(ваш другой пример) значения следующие:
ea382d63efca32d8d7861a314a6112e3
соответствии с ISO-8859-1 dc11cdbaa05aa41640a821fb8e290eae
под UTF-8 Вторая проблема связана с тем, что строки обычно определяются как NUL (или нулевые) завершенные буферы.
Однако есть обходной путь. iso-8859-1 определяет 256 возможных символов (включая символ NUL). Первые 256 кодовых точек в UTF такие же, как в iso-8859-1 (кодировка может различаться, если вы используете UTF-8, UTF-16 и т. Д., Но кодовые точки не зависят от того, как вы кодируете эти кодовые точки).
Итак, если вы знаете, что все кодовые точки в вашей строке будут находиться в диапазоне 0-255 (так как это latin1), и вы знаете, что нормально иметь встроенные NUL, вы можете вручную перебирать свою строку, получить кодовую точку каждого символа и сохраните его как байт в буфере. Что-то вроде этого:
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)); }