Буфер NodeJS.from(ArrayBuffer) создает устаревшие данные

#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 работает отлично.