Как прочитать двоичный фрагментированный ответ с помощью Fetch API. Я использую следующий код, который работает до тех пор, пока он читает фрагментированный ответ с сервера. Однако данные, похоже, каким-то образом кодируются/декодируются, что иногда приводит к сбою getFloat32
. Я попытался прочитать ответ с помощью curl, и это отлично работает, что заставляет меня поверить, что мне нужно что-то сделать, чтобы fetch api обрабатывал куски как двоичные файлы. Тип содержимого ответа правильно установлен на «application/octet-stream».
const consume = responseReader => {
return responseReader.read().then(result => {
if (result.done) { return; }
const dv = new DataView(result.value.buffer, 0, result.value.buffer.length);
dv.getFloat32(i, true); // <-- sometimes this is garbled up
return consume(responseReader);
});
}
fetch('/binary').then(response => {
return consume(response.body.getReader());
})
.catch(console.error);
Используйте следующий экспресс-сервер, чтобы воспроизвести его. Обратите внимание, что любой код js на стороне клиента, который может обрабатывать указанный ниже сервер, подойдет.
const express = require('express');
const app = express();
app.get('/binary', function (req, res) {
res.header("Content-Type", "application/octet-stream");
res.header('Content-Transfer-Encoding', 'binary');
const repro = new Uint32Array([0x417055b8, 0x4177d16f, 0x4179e9da, 0x418660e1, 0x41770476, 0x4183e05e]);
setInterval(function () {
res.write(Buffer.from(repro.buffer), 'binary');
}, 2000);
});
app.listen(3000, () => console.log('Listening on port 3000!'));
При использовании указанного выше узла server -13614102509256704 будет зарегистрировано в консоли, но оно должно быть просто ~16,48. Как я могу получить исходный двоичный файл с плавающей запятой?
getFloat32
принимает смещение byte, четко задокументированное... - person vidstige   schedule 17.04.2018