Я столкнулся с очень странным поведением, которое я не понимаю, после попытки отладить свое приложение в течение полдня. Взгляните на следующий фрагмент:
const buffer = Buffer.from([12, 34, 56, 78, 90]);
const dataView = new DataView(buffer.buffer);
console.info('buffer byteLength:', buffer.byteLength);
console.info('dataView byteLength:', dataView.byteLength);
console.info('first uint8 in buffer:', buffer.readUInt8(0));
console.info('first uint8 in dataView:', dataView.getUint8(0));
Для меня вывод этого скрипта:
buffer byteLength: 5
dataView byteLength: 8192
first uint8 in buffer: 12
first uint8 in dataView: 99
Я использовал версию Node.js 8.6.0.
Очевидно, несмотря на то, что это не указано в официальная документация Buffer.from
, функция автоматически создает Buffer
с небезопасное размещение, описанным в документация Buffer.allocUnsafe()
.
Есть ответ на StackOverflow указывает на наличие свойства Buffer#byteOffset
, содержащего байтовое смещение для Buffer
, лежащего в основе ArrayBuffer
. Это свойство не задокументировано для самого Buffer
, но для Uint8Array
, чей API Buffer
реализует.
Расширение исходного фрагмента следующей строкой приведет к ожидаемому результату.
console.info('first uint8 in dataView:', dataView.getUint8(buffer.byteOffset)); // output: 12