Est-il un moyen de lire des données binaires en JavaScript?
je voudrais injecter des données binaires dans un objet en JavaScript. Est-il un moyen de faire cela?
i.e.
var binObj = new BinaryObject('101010100101011');
quelque Chose à cet effet. Toute aide serait super.
10 réponses
vous pouvez utiliser parseInt:
var bin = parseInt('10101010', 2);
le second argument (le radix) est la base de l'entrée.
Il y a cette bibliothèque binaire ajaxexpliqué ici another binaire parser library qui peut traiter plus de types de données.
vous pouvez aussi regarder Google Gears qui a un Blob binaire de l'objet ou jetez un oeil à la fabrication d'un emballage javascript pour Flash qui fournit un native ByteArray mise en œuvre.
Ou... vous pouvez vous asseoir et attendre et espérer que toutes ces choses deviennent standard :)
Sur tous les navigateurs récents vous pouvez faire:
xhr.overrideMimeType('text/plain; charset=x-user-defined');
et récupérer une chaîne. Pour obtenir le résultat binaire vous devrez faire
data.charCodeAt(pos) & 0xff;
sur les constructions nocturnes de Firefox et Chrome vous pouvez récupérer la valeur comme un ArrayBuffer
xhr.responseType = "arraybuffer";
le résultat est alors accessible ici
xhr.mozResponseArrayBuffer // Firefox
xhr.response // Chrome
alors vous pouvez appliquer un TypedArray (par exemple: Int32Array) ou un DataView sur le tampon lire le résultat.
afin de faciliter ce processus, j'ai fait un jQuery Patch pour soutenir le type binaire et un DataView Wrapper qui utilise la dernière fonctionnalité de lecture disponible du navigateur.
JavaScript a très peu de support pour les données binaires brutes. En général, il est préférable de vivre dans cette restriction. Cependant, il y a un truc que j'envisage d'essayer pour un de mes projets qui implique la manipulation d'énormes bitmaps pour faire des opérations de set dans une base de données OLAP. Cela ne fonctionne pas sous IE.
l'idée de base est la suivante: forcer les données binaires dans un PNG pour les envoyer à JavaScript, par exemple, un bitmap peut être un PNG noir et blanc, avec un noir étant 100% transparent. Ensuite, utilisez les opérations Canvas pour effectuer une manipulation de données en bits.
HTML5 Canvas comprend pixel de la matrice de type, qui permet d'accéder aux octets d'une image. Canvas supporte également les opérations de composition, comme XOR. Lighten and darken devrait être en mesure de faire et et ou. Ces opérations sont susceptibles d'être bien optimisées dans n'importe quel navigateur qui les supporte-- probablement en utilisant le GPU.
Si quelqu'un essaie ceci, s'il vous plaît laissez-moi savoir comment cela fonctionne bien.
ce serait l'inverse... pow
et squareroot
peut être calculé par la classe de maths... Je ne sais pas si c'est le moyen le plus rapide, mais c'est aussi rapide que la calculatrice Windows dans la "vue du programmeur".
AlertFormatedBin();
function AlertFormatedBin()
{
var vals = decToBinArr(31,8);
var i;
var s = "";
var mod = vals.length % 4;
for(i= 0; i <mod;i++)
{
s+=vals[i];
}
if(i>0)
s+=" ";
var j = i;
for(i;i<vals.length;i++)
{
s+=vals[i];
if(i-j != 0 && (i+1-j)%4 == 0)
{
s+=" ";
}
}
alert(s);
}
function decToBinArr(dec, minSize)
{
var mod = dec%2;
var r = new Array();
if(dec > 1)
{
dec-=mod;
var bd = squareRootRoundedDown(dec);
if(minSize && minSize-1 > bd)
bd = minSize-1;
else
var i;
for(i = bd; i>0;i--)
{
var nxt = pow(2,i);
if(dec >= nxt)
{
r[i] = 1;
dec-=nxt;
}
else
{
r[i] = 0;
}
}
}
r[0]= mod;
r.reverse();
return r;
}
function squareRootRoundedDown(dec)
{
if(dec<2)
return 0;
var x = 2;
var i;
for(i= 1;true;i++)
{
if(x>=dec)
{
i = x == dec ? i : i-1;
break;
}
x= x*2;
}
return i;
}
function pow(b,exp)
{
if(exp == 0)
return 0;
var i = 1;
var r= b;
for(i = 1; i < exp;i++)
r=r*b;
return r;
}
dans un futur proche vous pourrez utiliser ArrayBuffers et fichiers API Blobs.
comme @Zippy l'a souligné dans un commentaire, les solutions les plus récentes (fin 2016) comprennent:
Javascript ne fournit pas de mécanisme pour charger un objet sous une forme autre que des chaînes simples.
ce que vous pouvez faire de plus proche est de sérialiser l'objet à une chaîne de caractères, éventuellement Encrypter/compresser, l'envoyer au navigateur, et décrypter/décompresser si nécessaire, vérifier la santé mentale, eval() et pray().
au lieu d'utiliser eval( qui n'est pas tout à fait sûr), vous pouvez utiliser votre propre format (alternativement, xml ou json pour lequel il y a beaucoup de libs) et le parser m'.
en guise de note secondaire, si vous voulez cela pour l'obscurcissement après que le navigateur obtienne les données utilisables (après décryptage/décompression), il est trop facile de le contourner.
pour Cent de codage peuvent ne pas encoder les chaînes en direct 1<->1 représentation de blob binaire et est également portable sur l'ensemble des navigateurs;
unescape("%uFFFF%uFFFF%uFFFF");
la Plupart des navigateurs exploiter l'utiliser cette technique pour intégrer shellcode dans les pages HTML, cela fonctionne très bien pour créer des flux binaires arbitraires.
jBinary " rend facile de créer, charger, analyser, Modifier et enregistrer des fichiers binaires complexes et des structures de données à la fois dans le navigateur et le noeud.js."
Je ne l'ai pas utilisé, mais c'est ce que j'ai trouvé en posant la même question posée ici...