在 JavaScript 中将字节解释为打包的二进制数据

Posted

技术标签:

【中文标题】在 JavaScript 中将字节解释为打包的二进制数据【英文标题】:Interpreting bytes as packed binary data in JavaScript 【发布时间】:2015-04-14 21:50:23 【问题描述】:

我有一个字节数组:

[101, 97, 115, 121] # ['e', 'a', 's', 'y']

如何将其解释为打包的二进制文件? Python 中的 struct.Struct(format).unpack 之类的东西:

>>> import struct
>>> s = struct.Struct('>1I') # a big-endian, two-byte, unsigned int
>>> s.unpack('easy')
(1700885369,)

有没有办法在 javascript 中实现这一点而无需导入?

【问题讨论】:

pack / unpack functions for node.js的可能重复 你会想看看DataViews 【参考方案1】:

在 JavaScript 中没有内置的方法可以做到这一点。但是,Python 的 struct 模块有各种端口,您可以使用它们来精确复制功能,例如jspack.

如果您只想拥有一个(或几个)操作,您可以轻松地自己实现它:

var bytes = [101, 97, 115, 121];
var unpacked = bytes.reduce(function (s, e, i)  return s | e << ((3 - i) * 8); , 0);
console.log(unpacked); // 1700885369

这本质上是一种奇特的方式:

121 | 115 << 8 | 97 << 16 | 101 << 24

或使用索引编写:

bytes[3] | bytes[2] << ((3-2) * 8) | bytes[1] << ((3-1) * 8) | bytes[0] << ((3-0) * 8)

反之亦然:

var number = 1700885369;
var bytes = [];
while (number > 0) 
    bytes.unshift(number & 255);
    number >>= 8;

console.log(bytes); // [101, 97, 115, 121]

【讨论】:

我怎样才能从unpacked返回字节数组? @ZachGates,你的意思是这样吗? NR = 0; while (n = bytes.shift()) nr @NicolaiNita 我当时编辑了我的答案以包含其他方式。 只是一个简短的说明。此答案仅适用于小于 2,147,483,648 的值。这是因为 Javascript 将按位值视为 32 位有符号整数。这意味着最左边的位用作“符号”,这意味着如果最左边的位为 1,则该数字为负数。只需尝试解压缩[255, 255, 255, 255],您就会得到-1。因此,尽管解压更大的值绝对是可能的,但实现起来并不那么简单。

以上是关于在 JavaScript 中将字节解释为打包的二进制数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Perl 中将二进制数据拆分为字节数组

在 Python 3 中将二进制字符串转换为字节数组

如何在 Python 中将字节数转换为二进制数?

将字节串解读为打包的二进制数据

将字节串解读为打包的二进制数据

在javascript中将图像转换为二进制数据[重复]