原标题:JavaScript中ArrayBuffer/DataView在python中的实现
有点标题党了。
注意这是一篇不通顺的文章
其实是想说ArrayBuffer有关的转换过程在python中怎么写的问题。
python的memoryview和JavaScript的DataView在名字上就有点相似。
其实它们确实差不多...
可以这样对应一下:
- ArrayBuffer <---> bytes
- DataView <---> memoryview
先看一下ArrayBuffer的样子:
与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就是这个值。具体参见文档,或者下面截图。
在下面这个例子中,对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])
DataView与memoryview
DataView的byteLength、byteOffset、buffer
对应
memoryview的nbytes、shape、obj
...写到这里感觉之前写的脚本又有好多地方可以优化了。。