Как использовать строки с JavaScript Typed Arrays - PullRequest
7 голосов
/ 16 ноября 2011

Я столкнулся с проблемой, заключающейся в том, что я не вижу способа легко преобразовать строки в типизированные массивы, и преобразование из типизированных массивов в строки представляется реальной проблемой, требующей ручного преобразования кодов символов для каждого байта. Есть ли лучшие методы для преобразования строк в типизированные массивы или наоборот?

Пример:

У меня есть строка в кодировке UTF8 «Что-то или другое», и я хочу записать ее в ArrayBuffer длиной, а затем в строковом формате.

Ответы [ 3 ]

3 голосов
/ 27 сентября 2012

Это должно решить вашу проблему

Как использовать строки с типизированными массивами JavaScript

Строки JS хранятся в кодировке UTF-16, где каждый символ занимает 2 байта. String.charCodeAt возвращает эти 2-байтовые Unicodes. Вот как читать строки в кодировке UTF-16 из DataView:

DataView.prototype.getUTF16String = function(offset, length) {
    var utf16 = new ArrayBuffer(length * 2);
    var utf16View = new Uint16Array(utf16);
    for (var i = 0; i < length; ++i) {
        utf16View[i] = this.getUint8(offset + i);
    }
    return String.fromCharCode.apply(null, utf16View);
};

и эти функции для преобразования строки в массив буферов и из него

    function ab2str(buf) {
       return String.fromCharCode.apply(null, new Uint16Array(buf));
     }

    function str2ab(str) {
       var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
       var bufView = new Uint16Array(buf);
       for (var i=0, strLen=str.length; i<strLen; i++) {
         bufView[i] = str.charCodeAt(i);
       }
       return buf;
     }
1 голос
/ 28 ноября 2013

Вы можете использовать TextEncoder и TextDecoder , которые в настоящее время, похоже, реализованы только в Firefox. Это два полных года после вашего первоначального вопроса:)

К счастью, существует polyfill , который выполняет эту работу.

var initialString = "Something or other";

var utf8EncodedString = new TextEncoder("utf-8").encode(initialString);

// utf8EncodedString is a Uint8Array, so you can inspect
// the individual bytes directly:
for (var i = 0; i < utf8EncodedString.length; ++i) {
    console.log(utf8EncodedString[i]);
}

var decodedString = new TextDecoder("utf-8").decode(utf8EncodedString);

if (initialString !== decodedString) {
    console.error("You're lying!");
}
0 голосов
/ 10 июня 2014

Если вы хотите использовать внешние библиотеки, вы можете взглянуть на jDataView , который поддерживает чтение строк в различных кодировках из TypedArray и также обрабатывает преобразование порядка байтов.

...