美文网首页
python 实现js DataView.setUint32()

python 实现js DataView.setUint32()

作者: 隐墨留白 | 来源:发表于2019-12-04 19:07 被阅读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]
    

    相关文章

      网友评论

          本文标题:python 实现js DataView.setUint32()

          本文链接:https://www.haomeiwen.com/subject/zrmlgctx.html