46

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

すなわち

var binObj = new BinaryObject('101010100101011');

その趣旨の何か。どんな助けでも素晴らしいでしょう。

4

11 に答える 11

31

parseInt を使用できます。

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

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

于 2008-11-29T16:46:32.690 に答える
23

ここで説明されているこのバイナリ ajax ライブラリと、より多くのデータ型を処理できる別のバイナリ パーサー ライブラリもあります。

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

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

于 2009-11-22T21:15:28.023 に答える
16

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

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 パッチと、ブラウザの最新の読み取り機能を使用するDataView ラッパーを作成しました。

于 2011-01-27T11:02:57.903 に答える
11

JavaScript は生のバイナリ データをほとんどサポートしていません。一般に、この制限内で生活することが最善です。ただし、OLAP データベースで設定操作を行うために巨大なビットマップを操作するという私のプロジェクトで試してみることを検討しているトリックがあります。 これは IE では機能しません

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

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

誰かがこれを試したら、どれくらいうまくいくか教えてください。

于 2009-09-11T16:57:44.127 に答える
2

それは逆です...powそしてsquarerootMath-Classによって計算されるかもしれません...それが最速の方法であるかどうかはわかりませんが、「プログラマービュー」のWindows電卓と同じくらい高速です。

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;
}
于 2010-12-10T16:42:56.323 に答える
2

近い将来、 ArrayBuffersFile API Blobsを使用できるようになります。

于 2011-01-07T23:24:44.507 に答える
2

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

于 2016-11-19T15:26:17.740 に答える
1

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

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

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

ちなみに、ブラウザが使用可能なデータを取得した後(復号化/解凍後)にこれを難読化する場合は、簡単に回避できます。

于 2008-11-29T23:46:35.727 に答える
1

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

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

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

于 2011-05-17T06:58:57.037 に答える
1

Google でこの古い投稿を見つけた皆さん、ようこそ。2019 年の時点で Chrome で機能するソリューションを見つけたので、これが単なる追加機能であるか、ほとんどの人が見落としているものであることを願っています。

0b番号にプレフィックスを使用できます。バイナリ表現を完全に取得することはできませんが、ストレージ用の整数に簡単に変換できます。たとえば、2 進数1010を次のように格納できます。

var binNum = 0b1010 //Stores as an integer, which would be 10

興味がある場合は、0x接頭辞付きの 16 進数でも機能します。

var binNum = 0x1010 //Stores as an integer, which would be 4112
于 2019-10-21T01:10:14.400 に答える
1

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

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

于 2014-12-18T22:33:08.790 に答える