кто может обьяснить, как работает этот код
function data_string(data) // Generates the binary data string from character / multibyte data { var str=''; for(var i=0,len=data.length;i<len;i++){ var a=String.fromCharCode(data[i].charCodeAt(0)&0xff); console.log(a+"\n"+str+"\n"+data[i]+"\n"+data.charCodeAt(i)+"\n"+data[i].charCodeAt(0)); // var a=String.fromCharCode(data.charCodeAt(i)&0xff);//это чем хуже? // var a=String.fromCharCode(data[i]&0xff);//или это // var a=String.fromCharCode(data.charCodeAt(i));//или вообще это str+=a; } return str; }; и что происходит в случае многобайтовых символов и нет ли встроенного аналога в firefox |
function data_string1(data) // Generates the binary data string from character / multibyte data { var str=''; for(var i=0,len=data.length;i<len;i++){ var a=String.fromCharCode(data[i].charCodeAt(0)&0xff); console.log(a+"\n"+str+"\n"+data[i]+"\n"+data.charCodeAt(i)+"\n"+data[i].charCodeAt(0)); str+=a; } return str; }; function data_string2(data) // Generates the binary data string from character / multibyte data { var str=''; for(var i=0,len=data.length;i<len;i++){ var a=String.fromCharCode(data.charCodeAt(i)&0xff);//это чем хуже? console.log(a+"\n"+str+"\n"+data[i]+"\n"+data.charCodeAt(i)+"\n"+data[i].charCodeAt(0)); str+=a; } return str; }; function data_string3(data) // Generates the binary data string from character / multibyte data { var str=''; for(var i=0,len=data.length;i<len;i++){ var a=String.fromCharCode(data[i]&0xff);//или это console.log(a+"\n"+str+"\n"+data[i]+"\n"+data.charCodeAt(i)+"\n"+data[i].charCodeAt(0)); str+=a; } return str; }; function data_string4(data) // Generates the binary data string from character / multibyte data { var str=''; for(var i=0,len=data.length;i<len;i++){ var a=String.fromCharCode(data.charCodeAt(i));//или вообще это console.log(a+"\n"+str+"\n"+data[i]+"\n"+data.charCodeAt(i)+"\n"+data[i].charCodeAt(0)); str+=a; } return str; }; alert(data_string1('йцу')); alert(data_string2('йцу')); alert(data_string3('йцу')); alert(data_string4('йцу')); |
Цитата:
только один из них дает тот же результат |
и ещё вопрос
почему не работает function toSinglebyte(data) { var data_string=''; for(var i=0,il=data.length;i<il;i++){ var cCode=data.charCodeAt(i); data_string+=String.fromCharCode(cCode>>>8); data_string+=String.fromCharCode(cCode&0xff); } return data_string; }; //window.location.href="data:text/plain;base64,"+btoa(toSinglebyte("qwerty")); window.location.href="data:text/plain;charset=UTF-8;base64,"+btoa(toSinglebyte("qwertyйцукен")); |
KOLANICH, Вы будете удивлены, но символ q уже занимает один байт.
А еще бывают символы, занимающие 3 и даже 4 байта. |
Цитата:
|
function splitBytes(data) { var data_string=''; for(var i=0,il=data.length;i<il;i++){ var cCode=data.charCodeAt(i); var bytes=[],highestByte=0; for(var j=0;j<4;j++){ bytes[j]=cCode>>>(8*j); if(bytes[j])highestByte=j; } console.log(bytes,highestByte); if(highestByte==0){data_string+=String.fromCharCode(bytes[0]);continue;} data_string+=String.fromCharCode(bytes[highestByte]|(12*16)); for(var j=highestByte-1;j>=0;j--){ data_string+=String.fromCharCode(bytes[j]|(8*16)); } } return data_string; }; var xhr=new XMLHttpRequest(); xhr.open("GET","http://www.google.com/recaptcha/api/image?c=03AHJ_VuuTZPpE0MzmQ0H3MXLoflLPf6Ofe-gOvgoorBrOKN9f6iHglvIkBp8Hm6gPT6au_9pPLqAfoKFKcxNF-14dUbxfKmN34nuVpLvddLiSEY52pYuRcIuSj3vCwJ4P2rDPQI49Ej9O65sPTXh0CskwWbohadL9GA",false); //xhr.overrideMimeType('text/plain; charset=x-user-defined'); xhr.send(); var imgbase64=btoa(splitBytes(xhr.responseText)); window.location.href="data:image/jpeg;base64,"+imgbase64; console.log(img); тоже хреново пашет |
Часовой пояс GMT +3, время: 07:16. |