2012-02-23 2 views
2

У меня есть простой PHP-файл, который загружает файл с моего сервера, base64 кодирует его и отгоняет его.JavaScript Base 64 Декодирование двоичных данных не работает

Тогда у меня есть простая HTML-страница, которая использует jQuery для извлечения этого файла, base64 декодирует его и выполняет проверку контрольной суммы. Тест контрольной суммы не работает.

I md5'd файл в PHP после его кодирования и md5'd его в javascript перед его расшифровкой и совпадением контрольных сумм (поэтому во время транзита ничего не получилось). Однако контрольные суммы предварительного кодирования и пост-декодирования НЕ совпадают.

Я использую webtoolkit.base64.js для его декодирования в JavaScript. Файл представляет собой двоичный файл (ZIP-архив).

Есть ли проблема с библиотекой декодирования или чем-то еще, о чем я не знаю, что может вызвать эту проблему? Может ли это быть проблема с библиотекой MD5 я использую (http://pajhome.org.uk/crypt/md5/md5.html)

+0

Вы пытались отправить простой текстовый файл, было бы легче отладить и не исключать, что кодировка base64 может быть виновата. – Dampsquid

+0

Я провел эти тесты с текстовыми файлами, и он отлично работает (включая контрольную сумму).Я предполагаю, что одна из двух библиотек, которые я использую, плохо обрабатывает двоичные данные. –

ответ

2

Краткое описание
Ваша библиотека MD5 в порядке, ваша библиотека base64 сломана.

Как ваша библиотека JavaScript Base64, так и библиотека MD5 работают некорректно.

  1. Я создал и проверил ZIP-файл из 15097 байт.
    MD5 Сумма: a9de6b8e5a9173140cb46d4b3b31b67c
  2. У меня есть base64-encoded этот файл: http://pastebin.com/2rfdTzYT (20132 bytes).
  3. Проверьте длину файла base64 в Pastebin, используя следующие JavaScript фрагмент кода:
    document.querySelector('.de1').textContent.replace(/\s/g,'').length;
  4. Base64-расшифровывает файл правильно с помощью atob и проверьте размер:

    window.b64_str = document.querySelector('.de1').textContent.replace(/\s/g,''); 
    console.log(atob(window.b64_str).length); /* 15097 */ 
    
  5. I что оба файла были точно равны с использованием Hexdump JavaScript library и команды UNIX xxd (доступно как EXE file for Windows).

Используя ваш декодер Base64, я получаю строку размером 8094. Это не 15097! Во время моих тестов я обнаружил, что метод atob возвращал неправильные байты после определенных последовательностей байтов, включая возврат каретки. Я еще не нашел для этого решения.

Ваша библиотека MD5 в порядке.

+0

Я создал собственную библиотеку Hexdump за последний день и проверил, что 'atob' на самом деле работает нормально. Md5sum algortihm вашей библиотеки, похоже, отличается от версии в UNIX/PHP. Когда у меня будет больше времени, я могу углубиться в нее. –

0

Возможно, я не понимаю вопроса, но если я не так, я раньше сталкивался с чем-то подобным. Библиотека javascript, которую вы используете, не работает в двоичном формате. Какие php-коды будут представлять собой кучу 1 и 0, но то, что выкладывает javascript, будет текстовым. Если вам нужна двоичная строка, вам придется преобразовать полученный текст в двоичный файл, тогда он должен быть таким же, как ваш исходный файл.

Смежные вопросы