Подтвердить что ты не робот

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

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

то есть.

var binObj = new BinaryObject('101010100101011');

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

Ответ 5

Это было бы наоборот... 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;
}

Ответ 8

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

  • DataView (стандарт)
  • jDataView (polyfill/расширение DataView)
  • jBinary (построено на jDataView)

Ответ 9

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

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

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

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

Ответ 10

Процентное кодирование может привести строки unescape в прямое 1 ↔ 1 представление любого двоичного blob и также переносится в разных браузерах;

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

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

Ответ 11

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

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

Ответ 12

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

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

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

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

var binNum = 0x1010 //Stores as an integer, which would be 4112