我想要将 JavaScript 数字的 MIN_SAFE_INTEGER
到 MAX_SAFE_INTEGER
范围(53位不包括符号)转换为一串跨越7个字节的比特流字符串,向左偏移两位以允许符号和空标识。
到目前为止,我能想到的最好方案是:
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);
}
很明显,这种方法速度非常慢(而且比特位还没有在所有7个活动字节中移动两个位置)。
有没有更快的方法?最好是完全避免字符串解析?
MAX_SAFE_INTEGER
允许的 53 位感到非常高兴,因为我在使用bignumber.js
,如果可以的话,我真的很想避免对第33
到53
位进行字符串解析。 - CoryG