Sto cercando di convertire l'intervallo MIN_SAFE_INTEGER
tramite MAX_SAFE_INTEGER
di un numero JavaScript (53 bit che non include il segno) in una stringa di bit distribuiti su 7 byte spostati due per consentire identificatori di segno e nulli.Il modo più veloce per convertire un intero in array di byte arbitrariamente ordinati in JavaScript?
Così lunga il migliore che è venuta in mente è:
function toUint8Array(data) {
data = data.toString(2);
data = new Array(65 - data.length).join('0') + data;
var ret = new Uint8Array(data.length/8);
for (var i = 0; i < 8; i++) {
ret[i] = 0;
ret[i] += (data[i * 8] == '1' ? 128 : 0);
ret[i] += (data[(i * 8) + 1] == '1' ? 64 : 0);
ret[i] += (data[(i * 8) + 2] == '1' ? 32 : 0);
ret[i] += (data[(i * 8) + 3] == '1' ? 16 : 0);
ret[i] += (data[(i * 8) + 4] == '1' ? 8 : 0);
ret[i] += (data[(i * 8) + 5] == '1' ? 4 : 0);
ret[i] += (data[(i * 8) + 6] == '1' ? 2 : 0);
ret[i] += (data[(i * 8) + 7] == '1' ? 1 : 0);
}
return (ret);
}
Come si può dire a destra fuori, questo sarebbe abominevole lento (e il bit ancora non sono stati spostati due posti su tutti i 7 byte attivi)
C'è un modo per farlo più veloce? Idealmente evitando l'analisi delle stringhe del tutto?
In realtà DataView, ** utilizzato correttamente ** vale a dire non come lo si è provato, può fornire un modesto (3X in Firefox, 1.5X in Chrome, ** 7.5X ** in Internet Explorer) miglioramento della velocità - e potrei farlo in modo subottimale –
@JaromandaX Sarei curioso di vedere come lo gestisci per produrre l'output che sto tentando di ottenere. – CoryG
Posso fare un violino, ma ... l'input è strettamente limitato a MIN_SAFE_INTEGER -> MAX_SAFE_INTEGER - una domanda ... i bit di segno/null devono essere l'LSB del settimo byte o l'MSB del primo byte? –