AJAX - 将返回的八位字节流转换为类型化数组 (Float64Array)

Posted

技术标签:

【中文标题】AJAX - 将返回的八位字节流转换为类型化数组 (Float64Array)【英文标题】:AJAX - Convert returned octet-stream to typed array (Float64Array) 【发布时间】:2021-09-28 13:19:39 【问题描述】:

我无法弄清楚我在这里做错了什么。我正在尝试将从 AJAX 调用返回的二进制流转换为 javascript 中的双精度数组。一些代码:我的服务器 php 返回一个八位字节流(双精度数组):

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;

在我的网页中,我有一个 AJAX 调用:

function getData() 
    $.ajax(
        type: 'GET',
        url:  '/my/rest/call/to/above/php/code',
        success: function(data) 
            doSomething(data);
        ,
        error: function(data, status, error) 
        
    );

然后我的函数用于处理从其余调用返回的数据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.

我面临的问题是Float64Array 似乎没有将我的数据转换为数组。我的大小为零且未定义,而 count 是一个很大的数字。 Chrome 中没有控制台错误,所以我很难确定我所缺少的内容。我想先将data 转换为ArrayBuffer 吗?我在十六进制编辑器中查看了data,并确认返回的字节流是具有正确值的正确双精度数组(64 位小端)。

【问题讨论】:

您可能需要调整 AJAX 请求中的 xhrFields 属性以设置 responseType = "arraybuffer"。见developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/… 我不得不将我的ajax 调用换成xhr 的处理方式,现在它可以工作了。顺便说一句 - 自从我看到 ajaxXMLHttpRequest 都使用过之后,最好的方法是什么? 它们是一样的。 jQuery 的 $.ajax() 只是 XMLHttpRequest 的包装器 【参考方案1】:

Float64Array 构造函数需要一个 ArrayBuffer 参数。为了让浏览器这样解释响应,请尝试

$.ajax(
  url: "/my/rest/call/to/above/php/code",
  method: "GET",
  success: doSomething,
  error: (_, ...err) => console.error(...err),
  xhrFields: 
    responseType: "arraybuffer"
  
)

fetch API 等效项是这样的,使用 Response.arrayBuffer() 方法

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)
  

【讨论】:

我不得不切换到 xhr.onload 方法才能让它工作,但我更喜欢你的方法。谢谢。

以上是关于AJAX - 将返回的八位字节流转换为类型化数组 (Float64Array)的主要内容,如果未能解决你的问题,请参考以下文章

将八位字节流转换为图像

Spring Boot - RabbitMQ - 将消息内容类型从八位字节流更改为 json

将字符串转换为应用程序/八位字节流 Java

在颤动中将应用程序/八位字节流转换为图像/jpeg/png?

使用 PHP 或 Django 在 Apache 中重定向八位字节流

S3 对象返回八位字节流,但上传为 png