I cannot figure out what I’m doing wrong here. I’m trying to convert a binary stream, returned from an AJAX call, to an array of doubles in JavaScript. Some code: My server PHP returns an octet-stream (array of doubles):
while(logic_code) { $binary .= pack('ddd*', item1, item2, item3); } header('Content-type: application/octet-stream'); header('Content-length: ' . strlen($binary)); http_response_code(200); echo $binary; exit;
In my webpage I have an AJAX call:
function getData() { $.ajax({ type: 'GET', url: '/my/rest/call/to/above/php/code', success: function(data) { doSomething(data); }, error: function(data, status, error) { } }); }
And then my function for processing the returned data from the rest call doSomething(data)
:
function doSomething(data) { // Some code here. var count = data.length / (8); // Get number of DOUBLES var arr = new Float64Array(data, 0, count); console.log(arr); // Problem: 'arr' is undefined, or array of 0; but 'count' is non-zero. // More code here. }
The issue I’m facing is that Float64Array
doesn’t seem to be converting my data to an array. I get a size of zero and undefined while count
is a large number. There are no console errors in Chrome so I’m having a hard time really pinning down what I’m missing. Am I suppose to convert data
to an ArrayBuffer
first? I have looked at data
in a hex editor and confirmed the returned byte stream is the correct array of doubles (64-bit little endian) with correct values.
Advertisement
Answer
The Float64Array
constructor expects an ArrayBuffer
argument. In order to have the browser interpret the response as such, try
$.ajax({ url: "/my/rest/call/to/above/php/code", method: "GET", success: doSomething, error: (_, ...err) => console.error(...err), xhrFields: { responseType: "arraybuffer" } })
The fetch
API equivalent would be like this, using the Response.arrayBuffer()
method
async function getData() { try { const res = await fetch("/my/rest/call/to/above/php/code") if (!res.ok) { throw new Error(`${res.status}: ${await res.text()}`) } doSomething(await res.arrayBuffer()) } catch (err) { console.error(err) } }