UNPKG

2.45 kBJavaScriptView Raw
1/**
2 * @name u8aToNumber
3 * @summary Creates a number from a Uint8Array object.
4 */
5export function u8aToNumber(value, { isNegative = false } = {}) {
6 const count = value.length;
7 if (isNegative) {
8 let result = 0;
9 switch (count) {
10 case 0:
11 return 0;
12 case 1:
13 result = value[0] ^ 255;
14 break;
15 case 2:
16 result = (value[0] + (value[1] << 8)) ^ 65535;
17 break;
18 case 3:
19 result = (value[0] + (value[1] << 8) + (value[2] << 16)) ^ 16777215;
20 break;
21 case 4:
22 // for the 3rd byte, we don't << 24 - since JS converts all bitwise operators to
23 // 32-bit, in the case where the top-most bit is set this yields a negative value
24 result = (value[0] + (value[1] << 8) + (value[2] << 16) + (value[3] * 16777216)) ^ 4294967295;
25 break;
26 case 5:
27 result = ((value[0] + (value[1] << 8) + (value[2] << 16) + (value[3] * 16777216)) ^ 4294967295) + ((value[4] ^ 0xff) * 4294967296);
28 break;
29 case 6:
30 result = ((value[0] + (value[1] << 8) + (value[2] << 16) + (value[3] * 16777216)) ^ 4294967295) + (((value[4] + (value[5] << 8)) ^ 65535) * 4294967296);
31 break;
32 default:
33 throw new Error('Value more than 48-bits cannot be reliably converted');
34 }
35 return (result * -1) - 1;
36 }
37 switch (count) {
38 case 0:
39 return 0;
40 case 1:
41 return value[0];
42 case 2:
43 return value[0] + (value[1] << 8);
44 case 3:
45 return value[0] + (value[1] << 8) + (value[2] << 16);
46 case 4:
47 // for the 3rd byte, we don't << 24 - since JS converts all bitwise operators to
48 // 32-bit, in the case where the top-most bit is set this yields a negative value
49 return value[0] + (value[1] << 8) + (value[2] << 16) + (value[3] * 16777216);
50 case 5:
51 return value[0] + (value[1] << 8) + (value[2] << 16) + ((value[3] + (value[4] << 8)) * 16777216);
52 case 6:
53 return value[0] + (value[1] << 8) + (value[2] << 16) + ((value[3] + (value[4] << 8) + (value[5] << 16)) * 16777216);
54 default:
55 throw new Error('Value more than 48-bits cannot be reliably converted');
56 }
57}
\No newline at end of file