MD5 строки в ActionScript возвращает неверные результаты, когда какой-то hex является частью строки (т. Е. «Abc \ xBF \ x4E»)

Я пытаюсь 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, когда дело доходит до строковой кодировки, представления и т. Д. Спасибо, Дрю С.

Solutions Collecting From Web of "MD5 строки в ActionScript возвращает неверные результаты, когда какой-то hex является частью строки (т. Е. «Abc \ xBF \ x4E»)"

Скорее всего, 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)); }