在javascript中将Float32Array转换为base64

在javascript中将Float32Array转换为base64,javascript,base64,Javascript,Base64,有很多关于将blob或Uint8Array转换为base64的问答。但我一直无法找到如何将32位数组转换为base64。这是一个尝试 function p(msg) { console.log(msg) } let wav1 = [0.1,0.2,0.3] let wav = new Float32Array(wav1) p(`Len array to encrypt=${wav.length}`) let omsg = JSON.stringify({onset: { id: 'abc',

有很多关于将blob或
Uint8Array
转换为base64的问答。但我一直无法找到如何将32位数组转换为base64。这是一个尝试

function p(msg) { console.log(msg) }

let wav1 = [0.1,0.2,0.3]
let wav = new Float32Array(wav1)
p(`Len array to encrypt=${wav.length}`)
let omsg = JSON.stringify({onset: { id: 'abc', cntr: 1234}, wav: atob(wav) })
p(omsg)
atob
提供:

 Uncaught InvalidCharacterError: Failed to execute 'atob' on 'Window': 
 The string to be decoded is not correctly encoded."
需要哪一个中间步骤才能将浮点数正确编码到base64?请注意,我也尝试过用
tweet
而不是
atob
的方式:

 nacl.util.encodeBase64(wav)
这会导致相同的错误

使用JSON更新。对于上述情况,即:

“0.1000000149011612,”1:0.2000000029802224,“2:0.300000119092896

我们正在传输大型阵列,因此这是一个次优解决方案


Update公认答案中解决方案的关键元素是使用
Float32Array(floats).buffer
。我不知道
buffer
属性。

当前代码的问题是
nacl.util.encodeBase64()
接受字符串、数组或Uint8Array。由于您的输入不是数组或Uint8Array,因此它假定您希望将其作为字符串传入

当然,解决方案是首先将其编码为Uint8Array,然后将Uint8Array编码为base64。解码时,首先将base64解码为Uint8Array,然后将Uint8Array转换回Float32Array。这可以使用JavaScript ArrayBuffers完成

const floatSize = 4;

function floatArrayToBytes(floats) {
    var output = floats.buffer; // Get the ArrayBuffer from the float array
    return new Uint8Array(output); // Convert the ArrayBuffer to Uint8s.
}

function bytesToFloatArray(bytes) {
    var output = bytes.buffer; // Get the ArrayBuffer from the Uint8Array.
    return new Float32Array(output); // Convert the ArrayBuffer to floats.
}

var encoded = nacl.util.encodeBase64(floatArrayToBytes(wav)) // Encode
var decoded = bytesToFloatArray(nacl.util.decodeBase64(encoded)) // Decode
如果你不喜欢函数,这里有一些单行线

var encoded = nacl.util.encodeBase64(new Uint8Array(wav.buffer)) // Encode
var decoded = new Float32Array(nacl.util.decodeBase64(encoded).buffer) // Decode

如果您要编码到base64,应该是这样的……但是
btoa
对字符串有效,而不是
Float32Array
s。为什么不让
JSON.stringify
进行序列化呢?
JSON.stringify
将float数组保留为每个元素4个字节?我认为它是每个元素的ascii版本,就像16个字节一样r元素(请参阅问题的更新)使用您在Float32Array缓冲区的Uint8Array视图上看到的Uint8Array。类型化数组只是一个视图,您可以在同一缓冲区上创建其中许多数组,而无需分配任何新数据。但为什么您不能直接传输二进制数据?(直接发送缓冲区)@Kaido下一步将对数据进行加密:afaik不能在浮点上进行加密。在任何情况下,
Tweet Nacl
库都不支持它。数据是二进制数据,您在该数据上有一个Float32Array视图不会改变这一点。同样,TypeDarray是唯一的视图。如果某些代码需要以Uint8Array的形式读取数据,请给它们一个Uint8底层缓冲区的数组视图。没有浮点数或任何数据。您编写的关键-我需要的是
floats。buffer
我将为该作品颁奖。谢谢!