原标题:JavaScript中ArrayBuffer/DataView在python中的实现

有点标题党了。

注意这是一篇不通顺的文章

其实是想说ArrayBuffer有关的转换过程在python中怎么写的问题。

python的memoryview和JavaScript的DataView在名字上就有点相似。

其实它们确实差不多...

可以这样对应一下:

  • ArrayBuffer <---> bytes
  • DataView <---> memoryview

先看一下ArrayBuffer的样子:
2020-09-16T08:41:36.png

与python的bytes不同的是它有4个可索引的合集对象(而且还套娃),便于一些计算。
在js转py的过程中这很不方便,然后一种个人认为比较合理的方式如下(后知后觉),那就是用struct来解析。

提前说明:

  • !是指按大端解析,js里面(ArrayBuffer)看到那些数也是基于大端
  • 数字加字符是指按该字符对应模式解析这么多次,但对于数字加字符s指的是这么多个字节
  • unpack_from是在指定的offset处按格式字符串解析,不用考虑格式字符串对应的字节数与实际bytes大小相同
  • ArrayBuffer中Uint8Array对应struct格式字符是I,Uint8Array中U是无符号的意思,8是指单个元素的值最大不超过2^8也就是小于256,struct中标准大小*8就是这个值。具体参见文档,或者下面截图。

2020-09-16T09:01:06.png

在下面这个例子中,对bytes对象buffer,从位置5开始,以大端方式按两个unsigned int,3个字符,一个整数(0-255)的形式解析:

>>> buffer = b"123" * 6
>>> struct.unpack_from("!2l3cB", buffer, offset=5)
(858862131, 825373489, b'2', b'3', b'1', 50)

js中Uint8Array是纯数字的,所以可以把上面的3c换成3B,这个结果在js中就是new Uint8Array([858862131, 825373489, 50, 51, 49, 50])
2020-09-16T09:09:14.png

DataView与memoryview

DataView的byteLength、byteOffset、buffer
对应
memoryview的nbytes、shape、obj

...写到这里感觉之前写的脚本又有好多地方可以优化了。。

标签: none

添加新评论