кто может обьяснить, как работает этот код
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, время: 01:48. |