python pow和**_python 實現js DataView.setUint32()函式
阿新 • • 發佈:2021-01-05
技術標籤:python pow和**
在檢視YY直播彈幕url生成過程中,在js中遇到了這樣一個函式:
斷點檢視
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]