Получение битов из Javascript Uint8ClampedArray - PullRequest
0 голосов
/ 07 декабря 2018

У меня работает сервер узлов, и на сервере я генерирую и сохраняю в Redis набор битов, представляющих цвета на холсте.Каждые четыре бита сохраненных битов представляют 4-битный цвет.(Например, если я храню 001001101011111, то интересующие меня цвета: 0010, 0110, 1011 и 1111).

var byteArr = new ArrayBuffer(360000);
redis_client.set("board", byteArr);
redis_client.setbit("board", 360000, 0);

// There is some garbage at the beginning of the stored value, so zeroing them out.
for(var i = 0; i < 160; i++){
    redis_client.setbit("board", i, 0);
}

Когда клиент подключается к серверу, я получаю эту строку из Redisи отправить его через Websocket:

wss.on('connection', function(ws) {
    redis_client.get("board", function (error, result) {
        var initial_send = {"initial_send":true, "board":result};
        ws.send(JSON.stringify(initial_send));
    });

На стороне клиента я читаю доску так:

socket.onmessage = function (event) {
    var o = JSON.parse(event.data);
    board = o["board"];                                        
    var clampedBoard = new Uint8ClampedArray(board.length); 

    for(var i = 0; i < board.length; i++){                     
        clampedBoard = board[i];                               
    }
}

На этом этапе длина board равна45000, я полагаю, это потому, что в Javascript самый маленький конструктор TypedArray допускает только 1 байт.Поэтому, поскольку мой начальный ArrayBuffer был размером 360000, когда я получаю его в клиенте, он имеет размер 360000 / 8.

Вот где у меня возникают проблемы.На этом этапе, если я получу clampedBoard[0], он должен дать мне первые 8 бит (первые два цвета, которые меня интересуют), и я могу сделать clampedBoard[0]>>4 и clampedBoard[0]&15, чтобы получить эти два цвета, и я могузатем найдите их на карте с ключами 0000, 0001 и т. д.

Но это не то, что происходит.

Вот что я попробовал, и что я знаю:

  1. Печать значений на стороне клиента: console.log(clampedBoard[0]) возвращает [] нулевой / неопределенный символ на консоли Chrome.

  2. На стороне сервера, при инициализации byteArr и очистке первых 160 значений до 0, я вручную установил первые 8 битов в «00111111», что является двоичным представлением символа ASCII «?».

Когда console.logging clampBoard[0] на стороне клиента, я получаю тот же [] нулевой / неопределенный символ, но когда console.logging board[0], он печатает '?'.Я не уверен, почему это так.

И когда я пытаюсь посмотреть мою карту цветов, выполнив clampedBoard[0]>>4, он всегда по умолчанию равен ключу в словаре, который представляет 0, даже если ондолжно быть 0011.

Если есть какая-либо дополнительная информация, которую я могу предоставить, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 07 декабря 2018

Прежде всего, вы можете сделать:

board = o["board"];                                        
var clampedBoard = new Uint8ClampedArray(board); 

Так что вам не понадобится цикл инициализации значения.

Кроме того, как вы передавали его объекту,«stringification» преобразует его в строку вместо массива.Чтобы получить массив, вам нужно создать буфер Array Node.js из ArrayBuffer, а затем преобразовать его в собственный массив, например:

var view = Buffer.from(result); 
var initial_send = {"initial_send":true, "board":[...view]}; 
...