1. 程式人生 > 其它 >python pow和**_python 實現js DataView.setUint32()函式

python pow和**_python 實現js DataView.setUint32()函式

技術標籤:python pow和**

在檢視YY直播彈幕url生成過程中,在js中遇到了這樣一個函式:

斷點檢視

9372f691203cb12fe319065092969dbf.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.prototype.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)
    #結果
    [165, 58, 0, 0]


    # 測試
    # 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]