web-dev-qa-db-fra.com

Existe-t-il un moyen de lire des données binaires en JavaScript?

Je voudrais injecter des données binaires dans un objet en JavaScript. Y a-t-il un moyen de faire cela?

c'est à dire.

var binObj = new BinaryObject('101010100101011');

Quelque chose à cet effet. Toute aide est la bienvenue.

46
user41814

Vous pouvez utiliser parseInt:

var bin = parseInt('10101010', 2);

Le deuxième argument (le radix) est la base de l'entrée.

30
Greg

Il y a cette bibliothèque ajax binaire qui est expliquée ici et il y a aussi ne autre bibliothèque d'analyseur binaire qui peut gérer plus de types de données.

Vous pouvez également regarder Google Gears qui a n objet Blob binaire ou jeter un œil à la création d'un wrapper javascript pour Flash qui fournit un implémentation native de ByteArray .

Ou ... vous pouvez vous asseoir et attendre et espérer que toutes ces choses deviennent standard :)

23
RandomEtc

Sur tous les navigateurs récents, vous pouvez faire:

xhr.overrideMimeType('text/plain; charset=x-user-defined');

Et récupérez une chaîne. Pour obtenir le résultat binaire, vous devrez faire

data.charCodeAt(pos) & 0xff;

Sur les versions nocturnes de Firefox et Chrome vous pouvez récupérer la valeur sous la forme d'un ArrayBuffer

xhr.responseType = "arraybuffer";

Le résultat y est alors accessible

xhr.mozResponseArrayBuffer // Firefox
xhr.response // Chrome

Ensuite, vous pouvez appliquer un TypedArray (par exemple: Int32Array) ou un DataView sur le tampon pour lire le résultat.


Afin de faciliter ce processus, j'ai créé un jQuery Patch pour prendre en charge le type binaire et un DataView Wrapper qui utilise la dernière fonction de lecture disponible du navigateur.

16
Vjeux

JavaScript a très peu de support pour les données binaires brutes. En général, il est préférable de respecter cette restriction. Cependant, il y a une astuce que j'envisage d'essayer pour un de mes projets qui consiste à manipuler d'énormes bitmaps pour effectuer des opérations de définition dans une base de données OLAP. Cela a gagné ' t fonctionne dans IE .

L'idée de base est la suivante: contraindre les données binaires dans un PNG pour les envoyer à JavaScript. Par exemple, un bitmap peut être un PNG noir et blanc, le noir étant 100% transparent. Utilisez ensuite les opérations Canvas pour effectuer des manipulations de données au niveau du bit.

Le HTML5 Canvas inclut un type de tableau de pixels , qui permet d'accéder aux octets d'une image. Canvas prend également en charge les opérations de composition, telles que XOR. Éclaircir et assombrir devrait pouvoir faire ET et OU. Ces opérations sont susceptibles d'être bien optimisées dans tout navigateur qui les prend en charge, probablement à l'aide du GPU.

Si quelqu'un essaie cela, faites-moi savoir à quel point cela fonctionne.

10
David Leppik

Ce serait l'inverse ... pow et squareroot pourraient être calculés par la classe Math ... Je ne sais pas si c'est le moyen le plus rapide, mais c'est aussi rapide comme 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;
}
2
Frithjof

Comme @Zippy l'a souligné dans un commentaire, les solutions les plus récentes (fin 2016) comprennent:

2
Brian M. Hunt

Dans un avenir proche, vous pourrez utiliser ArrayBuffers et File API Blobs .

2
GGG

Javascript ne fournit pas de mécanisme pour charger un objet sous une forme autre que de simples chaînes.

Le plus proche que vous pouvez faire est de sérialiser l'objet en une chaîne, de le chiffrer/compresser éventuellement, de l'envoyer au navigateur et de déchiffrer/décompresser si nécessaire, en vérifiant la santé mentale, eval () et pri ().

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 bibliothèques) et l'analyser vous-même.

En guise de remarque, si vous le souhaitez pour l'obscurcissement une fois que le navigateur a obtenu les données utilisables (après le décryptage/décompression), il est trop facile de les contourner.

1
artificialidiot

jBinary "facilite la création, le chargement, l'analyse, la modification et la sauvegarde de fichiers binaires complexes et de structures de données dans le navigateur et Node.js."

Je ne l'ai pas utilisé, mais c'est ce que j'ai trouvé en posant la même question posée ici ...

1
zippy

L'encodage en pourcentage peut libérer les chaînes en une représentation directe 1 <-> 1 de n'importe quel blob binaire et est également portable sur tous les navigateurs;

unescape("%uFFFF%uFFFF%uFFFF");

La plupart des exploits de navigateur utilisent cette technique pour intégrer le shellcode dans les pages HTML, cela fonctionne très bien pour créer des flux binaires arbitraires.

1
RandomNickName42