Есть ли способ прочитать двоичные данные в JavaScript? - PullRequest
46 голосов
/ 29 ноября 2008

Я хотел бы добавить двоичные данные в объект в JavaScript. Есть ли способ сделать это?

т.е.

var binObj = new BinaryObject('101010100101011');

Что-то на этот счет. Любая помощь будет великолепна.

Ответы [ 10 ]

30 голосов
/ 29 ноября 2008

Вы можете использовать parseInt:

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

Второй аргумент (основание) является основой ввода.

23 голосов
/ 23 ноября 2009

Это двоичная библиотека ajax , которая объяснена здесь , а также другая библиотека двоичного синтаксического анализатора , которая может обрабатывать больше типов данных.

Вы также можете взглянуть на Google Gears, который имеет двоичный объект Blob или взглянуть на создание оболочки javascript для Flash, которая обеспечивает собственную реализацию ByteArray .

Или ... вы можете сидеть и ждать и надеяться, что все это станет стандартом :)

16 голосов
/ 27 января 2011

Во всех последних браузерах вы можете сделать:

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 , который использует последнюю доступную функцию чтения браузера.

10 голосов
/ 11 сентября 2009

JavaScript имеет очень небольшую поддержку необработанных двоичных данных. В общем, лучше жить в рамках этого ограничения. Однако есть одна хитрость, которую я подумываю попробовать для моего проекта, который включает в себя манипулирование огромными растровыми изображениями для выполнения операций над множествами в базе данных OLAP. Это не будет работать в IE .

Основная идея заключается в следующем: принудительно преобразовать двоичные данные в PNG для отправки их в JavaScript. Например, растровое изображение может быть черно-белым PNG с черным на 100% прозрачным. Затем используйте операции Canvas для побитовой обработки данных.

HTML5 Canvas включает пиксельный массив типа , который обеспечивает доступ к байтам в изображении. Canvas также поддерживает операции компоновки, такие как XOR. Светлые и темные должны уметь делать И и ИЛИ. Эти операции, вероятно, будут хорошо оптимизированы в любом браузере, который их поддерживает - возможно, с использованием графического процессора.

Если кто-нибудь попробует это, пожалуйста, дайте мне знать, насколько хорошо это работает.

2 голосов
/ 19 ноября 2016

Как отметил @Zippy в комментарии, более поздние (в конце 2016 г.) решения включают:

2 голосов
/ 08 января 2011

В ближайшее время вы сможете использовать ArrayBuffers и File API Blobs .

2 голосов
/ 10 декабря 2010

Это было бы наоборот ... pow и squareroot могли бы быть рассчитаны Math-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;
}
1 голос
/ 19 декабря 2014

jBinary"упрощает создание, загрузку, анализ, изменение и сохранение сложных двоичных файлов и структур данных как в браузере, так и в Node.js."

Я не использовал его, но это то, что я нашел, задавая тот же вопрос, заданный здесь ...

1 голос
/ 17 мая 2011

Кодирование в процентах может выводить строки в прямом 1 <-> 1 представлении любого двоичного двоичного объекта, а также переносимо во всех браузерах;

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

Большинство браузеров используют этот метод для встраивания шелл-кода в HTML-страницы, он очень хорошо работает для создания произвольных двоичных потоков.

1 голос
/ 30 ноября 2008

Javascript не предоставляет механизм для загрузки объекта в любой форме, кроме простых строк.

Самое близкое, что вы можете сделать, - это сериализовать объект в строку, при желании зашифровать / сжать его, отправить его в браузер и расшифровать / распаковать, если необходимо, проверить на здравомыслие, eval () и молитва ().

Вместо использования eval (что не совсем безопасно), вы можете использовать свой собственный формат (альтернативно, xml или json, для которого есть множество библиотек) и анализировать его самостоятельно.

В качестве примечания: если вы захотите запутать это после того, как браузер получит полезные данные (после расшифровки / распаковки), его слишком легко обойти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...