#node.js
#node.js
Вопрос:
Я получаю данные из потока в виде буфера длиной 24 байта, который содержит разные данные при каждом вызове. При обратном вызове я пытаюсь разделить буфер на два и зарегистрировать два новых буфера:
// data is an instance of Buffer 24 bytes long
console.log('data: ', data);
const timestamp = Buffer.from(data.buffer, 0, 16);
const eventType = Buffer.from(data.buffer, 16, 8);
console.log('split buffers:', timestamp, eventType);
Даже несмотря на мою первую консоль.журнал показывает правильные данные, второй показывает устаревшие данные для следующих событий, и только через 12 секунд он обновляется, а затем в течение следующих 12 секунд он показывает устаревшие данные.
Что происходит?
Ответ №1:
Если data.buffer
уже имеет тип ArrayBuffer
, нет необходимости использовать Buffer.from
— просто используйте:
let timestampBuff = data.buffer.slice(0, 16);
let eventTypeBuff = data.buffer.slice(16, 24);
Предоставление ArrayBuffer
to Buffer.from
создает общий буфер, то есть считывает / записывает в результирующую Buffer
ссылку ту же память, что и базовая ArrayBuffer
(объяснено здесь ). Это может создать некоторую путаницу. Использование slice
вместо этого создает новую память и должно избегать любых проблем со ссылками, с которыми вы сталкиваетесь
Если это не решит вашу проблему, вам может потребоваться предоставить код, который обновляет данные.
Комментарии:
1. Две заметки. Во-первых, я не хочу, чтобы результатом был буфер, data.buffer — это ArrayBuffer, поэтому выполнение среза над ним приведет к созданию ArrayBuffer? Во-вторых, я в порядке с буферами
timestamp
иeventType
, совместно использующими базовые данные сdata
буфером. Эти переменные отбрасываются в конце этого фрагмента, и новый обратный вызов создаст их снова, я не изменяю ни одну из этих переменных.2. OK. data.slice(начало, конец) вместо data.buffer.slice работает отлично.