Есть ли способ читать двоичные данные в JavaScript?

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

т.е.

var binObj = new BinaryObject('101010100101011');

Что-то в этом роде. Любая помощь будет замечательной.

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

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

Второй аргумент (radix) - это основание входных данных.

Комментарии (8)

Там's это двоичные библиотеки AJAX, что это объясняется здесь и там's также другой бинарный парсер библиотека, который может обрабатывать больше типов данных.

Вы также можете посмотреть на Гугл передач, которая имеет двоичный Blob объект или взглянуть на обертку JavaScript для вспышки, которое обеспечивает собственной реализации объекта ByteArray.

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

Комментарии (2)

На всех современных браузерах, вы можете сделать:

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

Комментарии (3)

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

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

В HTML5 Canvas входит тип массива пикселей, который позволяет получить доступ к байтам изображения. Canvas также поддерживает операции композиции, такие как XOR. Lighten и darken должны уметь выполнять AND и OR. Эти операции, вероятно, будут хорошо оптимизированы в любом браузере, который их поддерживает - вероятно, с использованием GPU.

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

Комментарии (1)

В ближайшем будущем вы сможете использовать ArrayBuffers и File капли АПИ.

Комментарии (0)

Что бы быть и наоборот... бац и корня может быть рассчитан по математике-класс... я не't знаю, если это самый быстрый способ, но он's так же быстро, как калькулятор Windows в "программист посмотреть на".

AlertFormatedBin();
function AlertFormatedBin()
{
    var vals = decToBinArr(31,8);
    var i;

    var s = "";
    var mod = vals.length % 4;
    for(i= 0; i 0)
        s+=" ";
    var j = i;
    for(i;i 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=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;
}
Комментарии (0)

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

Комментарии (0)

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

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

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

Комментарии (0)

и quot jBinary; позволяет легко создавать, загружать, анализировать, изменять и сохранять сложные двоичные файлы и структуры данных в браузере и узлов.Яш.&и"

Я не'т это's то, что я нашел, когда задают один и тот же вопрос здесь...

Комментарии (0)

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

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

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

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

Комментарии (1)

Добро пожаловать всем, кто нашел этот старый пост на Google. Я придумал решение, которое работает в Chrome, а 2019 года, так что, надеюсь, это просто некоторые дополнительные функции или что-то большинство людей пропустили.

Вы можете использовать префикс на ваш номер. Он выиграл'т достаточно получить двоичное представление, но вы можете легко преобразовать его в целое число для хранения. Например, можно хранить двоичное число 1010 как таковой:

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

Если вы'вновь любопытно, он также работает для шестнадцатеричном виде с префиксом 0x префикс:

var binNum = 0x1010 //Stores as an integer, which would be 4112
Комментарии (0)