У меня работает сервер узлов, и на сервере я генерирую и сохраняю в 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 и т. д.
Но это не то, что происходит.
Вот что я попробовал, и что я знаю:
Печать значений на стороне клиента: console.log(clampedBoard[0])
возвращает [] нулевой / неопределенный символ на консоли Chrome.
На стороне сервера, при инициализации byteArr
и очистке первых 160 значений до 0, я вручную установил первые 8 битов в «00111111», что является двоичным представлением символа ASCII «?».
Когда console.logging clampBoard[0]
на стороне клиента, я получаю тот же [] нулевой / неопределенный символ, но когда console.logging board[0]
, он печатает '?'.Я не уверен, почему это так.
И когда я пытаюсь посмотреть мою карту цветов, выполнив clampedBoard[0]>>4
, он всегда по умолчанию равен ключу в словаре, который представляет 0, даже если ондолжно быть 0011.
Если есть какая-либо дополнительная информация, которую я могу предоставить, пожалуйста, дайте мне знать.