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]
上一篇下一篇

猜你喜欢

热点阅读