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); }bin2hex = function(bin){// UTF-8 char -> ASCII hex
var hex = '';
for(var i = 0; i0xFF) c -= 0x350; // UTF-8 -> ASCII
hex += c.toString(16);
}
return hex;
}
hex2bin = function(hex) {// ASCII hex-> UTF-8 char
var bin = '';
for (var i=0; i0x7F) c += 0x350; // ASCII -> UTF-8
bin += String.fromCharCode(c);
}
return bin;
}
// hex2bin('2ff1ebe5f8') -> '/слеш'
// hex2bin('/слеш') -> '2ff1ebe5f8'
bin2hex = function(bin){ // UTF-8 string -> ASCII hex
var hex = '';
for(var i = 0; i0xFF) c -= 0x350; // UTF-8 -> ASCII
hex += c.toString(16);
}
return hex;
}
hex2bin = function(hex) { // ASCII hex-> UTF-8 string
var bin = '';
for (var i=0; i0x7F) c += 0x350; // ASCII -> UTF-8
bin += String.fromCharCode(c);
}
return bin;
}
alert( hex2bin('2ff1ebe5f8') ) // '/слеш'
alert( hex2bin('/слеш') ) // '2ff1ebe5f8'
bin2hex = function(bin){ // UTF-8 string -> ASCII hex var hex = ''; for(var i = 0; i<bin.length; i++){ var c = bin.charCodeAt(i); if (c>0xFF) c -= 0x350; // UTF-8 -> ASCII hex += c.toString(16); } return hex; } hex2bin = function(hex) { // ASCII hex-> UTF-8 string var bin = ''; for (var i=0; i<hex.length; i=i+2) { var c = parseInt(''+hex[i]+hex[i+1], 16); if (c>0x7F) c += 0x350; // ASCII -> UTF-8 bin += String.fromCharCode(c); } return bin; } alert( hex2bin('2ff1ebe5f8') ) // '/слеш' alert( hex2bin('/слеш') ) // '2ff1ebe5f8'Доброе время, подскажите что выполняет эта функция.
function y(a,b){
return parseInt(a,b||10)
}
function y(a,b){ return parseInt(a,b||10) }возвращает целочисленное значение переменной a в системе счисления b. Если аргумент b не передан, то за систему счисления выбирается десятичная. Функция бесполезна, так как является просто оберткой вокруг parseInt
Не работает!!!
bin2hex('ВвІіЇїЁё')
hex2bin('ВвІkqЁ')
Здравствуйте. Подскажите по крипту:
$email = strtoupper($_POST['email']);$expansion = "6";$bnetindex = "1";$bnetpassword = strtoupper(bin2hex(strrev(hex2bin(strtoupper(hash("sha256",strtoupper(hash("sha256", strtoupper($email)).":".strtoupper($_POST['pass']))))))));if($insbnet = $conn->prepare("INSERT INTO battlenet_accounts (email, sha_pass_hash) VALUES (?, ?);")) {$insbnet->bind_param("ss", $email, $bnetpassword);$insbnet->execute();$getid = $conn->prepare("SELECT id FROM battlenet_accounts WHERE email = ?");$getid->bind_param("s", $email);$getid->execute();$getid->bind_result($id);$getid->store_result();if($getid->num_rows > 0) {while($getid->fetch()) {$bnetacc = $id;$username = $id."#".$bnetindex;$accpassword = encryptpw($username, $_POST['pass']);}}if($insacc = $conn->prepare("INSERT INTO account (username, sha_pass_hash, email, expansion, battlenet_account, battlenet_index) VALUES (?, ?, ?, ?, ?, ?);")) {$insacc->bind_param("sssiii", $username, $accpassword, $email, $expansion, $bnetacc, $bnetindex);$insacc->execute();}else{echo $insacc->error;}}else{echo $insbnet->error;}
Там функция hex2bin() не совместима с версией моего денвера, как её заменить чтобы всё корректно работало в данном скрипте?