python 实现js DataView.setUint32()
2019-12-04 本文已影响0人
隐墨留白
在查看YY直播弹幕url生成过程中,在js中遇到了这样一个函数:
断点查看
setuint32.png
var A = ‘15013’
var e = new Uint8Array(4); # [0,0,0,0]
new DataView(e.buffer).setUint32(0, A, !0),
console.log(e) # [165, 58, 0, 0]
百度查找了一下setUint32函数的资料,这个网站是很详细的
语法
dataview .setUint32(byteOffset,value[,littleEndian])
参数
byteOffset 偏移量,从头开始计算,单位为字节.
value 设置的数值.
littleEndian 任选表示32位int是采用小端还是大端格式存储的。如果为false或未定义,则将写入big-endian值。
返回
undefined.
抛出错误
RangeError 如果byteOffset超出了视图能储存的值,就会抛出错误.
其实这个函数的原理很简单,列表e中的第一个元素代表0-255范围内的 数,如果超出就向右边进1,以此类推,e为[0,0,0,1] 时,A等于256 的3次幂。
那怎么用python来实现呢(不考虑大于等于256的4次幂的数)?
import random
def setunit32(num):
if not isinstance(num,int):
num = int(num)
print(num)
e = [0, 0, 0, 0]
if num < pow(256,4) and num // pow(256,3) >0:
e[3] = num // pow(256,3)
e[2] = num % pow(256,3) // pow(256,2)
e[1] = (num % pow(256,3) % pow(256,2)) // 256
e[0] = num % pow(256,3) % pow(256,2) % 256
elif num // pow(256, 2) > 0:
e[2] = num // pow(256, 2)
e[1] = num % pow(256, 2) // 256
e[0] = num % pow(256, 2) % 256
elif num // 256 > 0:
e[1] = num // 256
e[0] = num % 256
else:
e[0] = num
print(e)
return num
num = '15013'
result = setunit32(num)
# 测试
# test_list = []
# for i in range(10):
# num = random.choice(range(0,pow(256,4)))
# # num = random.choice(range(0,pow(256,3)))
# # num = random.choice(range(0,pow(256,2)))
# # num = random.choice(range(0,pow(256,1)))
# test_list.append(num)
# setunit32(num)
# print(test_list)
# 结果
#[85, 81, 10, 47]
#[132, 68, 171, 13]
#[36, 193, 198, 179]
#[168, 9, 110, 1]
#[27, 168, 179, 224]
#[207, 99, 2, 147]
#[177, 214, 85, 21]
#[8, 147, 84, 56]
#[91, 82, 139, 87]
#[79, 107, 140, 143]
#[789205333, 229328004, 3016147236, 23988648, 3769870363, 2466407375, 357947057, 945066760, 1468748379, 2408344399]