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.

45
demandé sur Drew Noakes 2008-11-29 19:43:32

10 réponses

vous pouvez utiliser parseInt:

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

le second argument (le radix) est la base de l'entrée.

30
répondu Greg 2008-11-29 16:46:32

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 :)

23
répondu RandomEtc 2009-11-22 21:15:28

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.

16
répondu Vjeux 2011-01-27 11:02:57

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.

10
répondu David Leppik 2009-09-11 16:57:44

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;
}
2
répondu Frithjof 2012-01-06 17:57:29

dans un futur proche vous pourrez utiliser ArrayBuffers et fichiers API Blobs.

2
répondu GGG 2013-07-29 08:53:17

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

2
répondu Brian M. Hunt 2016-11-19 15:26:17

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.

1
répondu artificialidiot 2008-11-29 23:46:35

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.

1
répondu RandomNickName42 2013-07-29 08:53:28

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...

1
répondu zippy 2014-12-18 22:33:08