Получение двоичных данных в Javascript (Ajax) - PullRequest
0 голосов
/ 01 февраля 2012

Я пытаюсь получить этот удаленный двоичный файл для чтения байтов, которые (конечно) должны находиться в диапазоне 0..255. Поскольку ответ дается в виде строки, мне нужно использовать charCodeAt, чтобы получить числовые значения для каждого символа. Я столкнулся с проблемой, что charCodeAt возвращает значение в UTF8 (если я не ошибаюсь), поэтому, например, значение ASCII 139 преобразуется в 8249. Это портит все мое приложение, потому что мне нужно получить эти значения, поскольку они отправляются из сервер.

Непосредственным решением является создание большого переключателя, который для каждого данного кода UTF8 будет возвращать соответствующий ASCII. Но мне было интересно, есть ли более элегантное и более простое решение. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

Следующий код был извлечен из ответа на этот вопрос StackOverflow и должен помочь вам обойти вашу проблему.

function stringToBytesFaster ( str ) { 
    var ch, st, re = [], j=0;
    for (var i = 0; i < str.length; i++ ) { 
        ch = str.charCodeAt(i);
        if(ch < 127)
        {
            re[j++] = ch & 0xFF;
        }
        else
        {
            st = [];    // clear stack
            do {
                st.push( ch & 0xFF );  // push byte to stack
                ch = ch >> 8;          // shift value down by 1 byte
            }
            while ( ch );
            // add stack contents to result
            // done because chars have "wrong" endianness
            st = st.reverse();
            for(var k=0;k<st.length; ++k)
                re[j++] = st[k];
        }
    }   
    // return an array of bytes
    return re; 
}

var str = "\x8b\x00\x01\x41A\u1242B\u4123C";

alert(stringToBytesFaster(str)); // 139,0,1,65,65,18,66,66,65,35,67
1 голос
/ 01 февраля 2012

Я бы порекомендовал кодировать двоичные данные в некотором независимом от кодировки формате, например, base64

...