function bin2hex(s){ // Convert binary data into hexadecimal representation
//
// + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
var i, f = s.length, a = [];
for(i = 0; i<f; i++){
a[i] = s.charCodeAt(i).toString(16);
}
return a.join('');
}
Взял с помощью здешнего file_get_contents() бинарник изображения.
Привёл к хексу данной функцией.
Сравнил с результатом, полученным в php.
Javascript выдал отличающийся результат (неверный).
Это недоработка данной функции, или жабаскрипт категорически не приемлет бинарные данные (не интерпретирующиеся как символы)?
Для символов с кодами 0—15
s.charCodeAt(i).toString(16) даст одну шестнадцеричную цифру, а не две.
Насчет следуюшего не уверен, но тоже может давать ошибки:
В js все строки считаются в utf-8. Произвольные бинарные данные не являются utf-8 совместимыми.
Я бы предложил такой вариант замены PHP функции bin2hex, а так же аналогичных в других языках: hex2bin(), hex2dec(), dec2hex, oct2dec() и так далее и тому подобное:
Number.prototype.convert=String.prototype.convert=function(outRadix, inRadix){ /* Параметры: - на входе число или строка, представляющая собой число - outRadix - система исчисления в которую надо преобразовать входные данные - inRadix (необязательный) - система исчисления в которой представлены входные данные (по умолчанию - 10 - в десятичной) Примечание: Функция объединяет в себе множество функций известных как: - hex2dec() - "ff".convert(10,16); //=255 - dec2hex() - (255).convert(16); //=FF - bin2hex() - "100000".convert(16,2); //=2F - hex2bin() - ('2F').convert(2,16); //=100000 - oct2dec() - ('10').convert(10,8); //=8 и т.д. и т.п. Возвращает: false - в случае ошибки Примечание: Если входные данные не соответствуют системе исчисления указанной в inRadix (в т.ч. по умолчанию) - будет выдана ошибка. Например: - 'FF'.convert(<любая>,10); //-в десятичной системе нет числа FF - '8'.convert(<любая>,8); //-в восмеричной системе нет числа 8 */ var val=this, outRadix=parseInt(outRadix), inRadix=parseInt(inRadix || 10), retVal; if(typeof(val)=='string') val=val.replace(/(^ *| *$)/g,'') function dec2x(val){ var val=val, retVal; val=(typeof(val)!='number') ? parseInt(val) : val; retVal=parseInt(val).toString(outRadix); return retVal; } function x2dec(val){ var val=String(val), retVal; retVal=parseInt(val, inRadix); return retVal; } if(inRadix==10){//10->x retVal=dec2x(val); if(outRadix==16) retVal=retVal.toUpperCase(); }else if(outRadix==10){//x->10 retVal=x2dec(val); }else{//x->10->x retVal=x2dec(val); retVal=dec2x(retVal); } return (retVal=='NaN' || retVal===false)? false : retVal; }Зачем столько ветвлений? Можно сразу универсальную сделать.
/** * Преобразование системы счисления * * @example convertNS("F5", 16, 2); // 11110101 * * @param string number * исходная запись числа (в СС from) * @param number from * исходная система счисления * @param number to * итоговая система счисления * @return string * итоговая запись числа (в СС to) */ function convertNS(number, from, to) { return parseInt(number, from).toString(to); }Отправить комментарий
Приветствуются комментарии:- Полезные.
- Дополняющие прочитанное.
- Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.Для остальных вопросов и обсуждений есть форум.