【问题标题】:Converting a string of packed bytes into an array of floats in Javascript在Javascript中将一串压缩字节转换为浮点数组
【发布时间】:2017-01-27 21:44:26
【问题描述】:

上下文

我知道在 python 中,您可以创建一个字符串来表示数组的打包字节,执行如下操作:

import numpy as np

np.array([1, 2], dtype=np.int32).tobytes() 
# returns '\x01\x00\x00\x00\x02\x00\x00\x00'

np.array([1, 2], dtype=np.float32).tobytes() 
# returns '\x00\x00\x80?\x00\x00\x00@'

并且可以使用np.fromstring对其进行解码

问题

目前,我的 Javascript 正在接收一串对浮点数数组进行编码的压缩字节(即'\x00\x00\x80?\x00\x00\x00@'),我需要对数组进行解码——最好的方法是什么?

(如果它是一个整数数组,我想我可以使用text-encoding 来提取字节,然后适当地相乘和相加......)

谢谢,

【问题讨论】:

  • 所以我想我们可以手动进行转换——显然protobufs 就是这样做的……(或者我们可以劫持他们的方法……)

标签: javascript arrays encoding


【解决方案1】:

首先,您必须将字符串转换为缓冲区,然后在该缓冲区上创建Float32Array。或者,传播它以创建一个普通的Array

str = '\x00\x00\x80?\x00\x00\x00@'

bytes = Uint8Array.from(str, c => c.charCodeAt(0))
floats = new Float32Array(bytes.buffer)

console.log(floats)

console.log([...floats]);

【讨论】:

  • 哈哈,看来我们刚刚在上面的评论中解决了!但感谢您确认:)
【解决方案2】:

浮点表示可能因平台而异。使用浮点数的二进制序列化形式将数字从一台机器传送到另一台机器并不是一个好主意。

也就是说,这个问题的答案可能对你有所帮助,前提是 JavaScript 使用的编码与数字源的编码相匹配:

Read/Write bytes of float in JS

【讨论】:

  • 有趣,那篇文章给了我一个好主意...我们可以将字符串读入 uint8 缓冲区,然后在缓冲区上使用 Float32Array view ....
猜你喜欢
  • 2012-03-05
  • 2016-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
相关资源
最近更新 更多