web-dev-qa-db-ja.com

JavaScriptでバイナリデータを読み取る方法はありますか?

JavaScriptのオブジェクトにバイナリデータを挿入したいと思います。これを行う方法はありますか?

つまり.

var binObj = new BinaryObject('101010100101011');

その効果への何か。どんな助けも素晴らしいでしょう。

46
user41814

ParseIntを使用できます:

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

2番目の引数(基数)は、入力の基数です。

30
Greg

これがあります バイナリajaxライブラリ つまり ここで説明します そして、 別のバイナリパーサーライブラリ があり、より多くのデータ型を処理できます。

バイナリBlobオブジェクト を持つGoogle Gearsを見るか、 ネイティブByteArray実装 を提供するFlashのJavaScriptラッパーを作成することもできます。

または...座って待って、これらすべてが 標準 になることを期待できます:)

23
RandomEtc

最近のすべてのブラウザで次のことができます。

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

そして、文字列を取得します。バイナリ結果を取得するには、あなたがする必要があります

data.charCodeAt(pos) & 0xff;

Firefoxのナイトリービルドでは、Chromeとして値を取得できます ArrayBuffer

xhr.responseType = "arraybuffer";

結果はそこでアクセス可能です

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

次に、バッファに TypedArray (例:Int32Array)または DataView を適用して、結果を読み取ります。


このプロセスを簡単にするために、バイナリタイプをサポートする jQuery Patch と、ブラウザで利用可能な最新の読み取り機能を使用する DataView Wrapper を作成しました。

16
Vjeux

JavaScriptは、生のバイナリデータをほとんどサポートしていません。一般に、この制限内で生活することが最善です。ただし、巨大なビットマップを操作してOLAP=データベース。これはできません ')のプロジェクトに挑戦することを検討しているトリックがあります。 IEで動作する

基本的な考え方は次のとおりです。バイナリデータをPNGに変換してJavaScriptに送信します。たとえば、ビットマップは白黒のPNGで、黒は100%透明です。次に、キャンバス操作を使用してビット単位のデータ操作を行います。

HTML5 Canvas には ピクセル配列型 が含まれており、画像内のバイトにアクセスできます。 Canvasは、XORなどの合成操作もサポートしています。明るくして暗くすると、ANDとORができるはずです。これらの操作は、おそらくGPUを使用して、それらをサポートするブラウザーで最適化される可能性があります。

誰かがこれを試してみたら、それがどれだけうまくいくかを私に知らせてください。

10
David Leppik

それは別の方法です... powsquarerootはMath-Classによって計算されるかもしれません...それが最速の方法であるかどうかはわかりませんが、それは同じくらい速いです「Programmer View」のWindows Calculatorとして。

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

@Zippyがコメントで指摘したように、最近(2016年後半)のソリューションには以下が含まれます。

2
Brian M. Hunt

近い将来、 ArrayBuffers および File API Blob を使用できるようになります。

2
GGG

Javascriptは、単純な文字列以外の形式でオブジェクトをロードするメカニズムを提供しません。

最も近い方法は、オブジェクトを文字列にシリアル化し、オプションでそれを暗号化/圧縮し、ブラウザに送信し、必要に応じて復号化/解凍し、健全性、eval()、pray()をチェックすることです。

Eval(これは非常に安全ではありません)を使用する代わりに、独自の形式(または、多数のライブラリがあるxmlまたはjson)を使用して、自分で解析することができます。

副次的な注意として、ブラウザーが使用可能なデータを取得した後(解読/解凍後)に難読化する場合、これを回避するのは簡単すぎます。

1
artificialidiot

jBinary 「ブラウザとNode.jsの両方で、複雑なバイナリファイルとデータ構造を簡単に作成、ロード、解析、変更、保存できます。」

私はそれを使用していませんが、同じ質問をここで尋ねたときに見つけたものです...

1
zippy

パーセントエンコーディングは、文字列をエスケープして任意のバイナリBLOBの直接的な1 <-> 1表現にすることができ、ブラウザ間で移植可能です。

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

ほとんどのブラウザのエクスプロイトは、HTMLコードにシェルコードを埋め込むために この手法 を使用します。これは、任意のバイナリストリームの作成に非常に有効です。

1