如何将双精度数组转换为 JS 数组?

Posted

技术标签:

【中文标题】如何将双精度数组转换为 JS 数组?【英文标题】:How to convert array of doubles into JS array? 【发布时间】:2021-10-18 08:39:01 【问题描述】:

我有 base64 编码的二进制数据(~2.5MB)。数据由 c double 值数组组成。在 c 语言中,使用这个数组是免费的——您只需将整个数据读入内存并使用double* 地址访问任何元素。

但是,现在我需要在 javascript 中使用这些数据。我正在寻找能够从 js 代码中读取此数组的最有效方法。

【问题讨论】:

您能否添加一个此类 base64 编码数据的简短样本以及它的预期输出必须是什么? 不幸的是,我没有短样本,也不知道如何将 2.5MB base64 数据修剪成短片。就字节而言,每个双精度数是 8 字节的有符号数。预期输出将是 Number 类型的 Array 或用于访问具有索引的元素的流类。 你不能从 C 中的 double 的短数组中生成一个短样本吗? @ikhvjs C 标记在这里如何相关?有 C 知识的人如何在这里提供帮助? @VLAZ,我只是认为了解 C 和 Javascript 的人会帮助解决这个问题。该问题提到了 C 中的数据类型。 【参考方案1】:

你可以在 Node 中使用这个函数:

function doublesFromBase64(base64) 
    let buff = Buffer.from(base64, 'base64');
    let result = [];
    for (let i = 0; i < buff.length; i += 8) 
        result.push(buff.readDoubleLE(i));
    
    return result;

为了测试它,我从以下一段 C 代码中生成了一个示例 base64 编码字符串,它使用了一个函数 base64_encode 发现 in this answer:

double arr[] = 15.9234, 2.05e30, -19;
size_t output_length;
char * result = base64_encode((unsigned char *) arr, 3* sizeof(double), &output_length);
printf("%s", result);

这个输出:

uECC4sfYL0Cjw3dB6N85RgAAAAAAADPA

我将此字符串传递给顶部的函数:

function doublesFromBase64(base64) 
    let buff = Buffer.from(base64, 'base64');
    let result = [];
    for (let i = 0; i < buff.length; i += 8) 
        result.push(buff.readDoubleLE(i));
    
    return result;


let result = doublesFromBase64("uECC4sfYL0Cjw3dB6N85RgAAAAAAADPA");

console.log(result);

这个输出:

[ 15.9234, 2.05e+30, -19 ]

【讨论】:

以上是关于如何将双精度数组转换为 JS 数组?的主要内容,如果未能解决你的问题,请参考以下文章

将双精度转换为字符数组 C++

如何将双精度值从 json 转换为函数

如何防止 PHP SoapClient 将双精度值转换为科学计数法?

将双精度值存储在二进制文件中并读取它

可可 - 将双精度转换为字符串

如何使用带有 0x 的 javascript 将双精度转换为十六进制 [重复]