UNPKG

2.27 kBJavaScriptView Raw
1// Copyright 2017-2022 @polkadot/util authors & contributors
2// SPDX-License-Identifier: Apache-2.0
3
4/**
5 * @name u8aToNumber
6 * @summary Creates a number from a Uint8Array object.
7 */
8export function u8aToNumber(value, {
9 isNegative = false
10} = {}) {
11 const count = value.length;
12
13 if (isNegative) {
14 let result = 0;
15
16 switch (count) {
17 case 0:
18 return 0;
19
20 case 1:
21 result = value[0] ^ 0x000000ff;
22 break;
23
24 case 2:
25 result = value[0] + (value[1] << 8) ^ 0x0000ffff;
26 break;
27
28 case 3:
29 result = value[0] + (value[1] << 8) + (value[2] << 16) ^ 0x00ffffff;
30 break;
31
32 case 4:
33 // for the 3rd byte, we don't << 24 - since JS converts all bitwise operators to
34 // 32-bit, in the case where the top-most bit is set this yields a negative value
35 result = value[0] + (value[1] << 8) + (value[2] << 16) + value[3] * 0x1000000 ^ 0xffffffff;
36 break;
37
38 case 5:
39 result = (value[0] + (value[1] << 8) + (value[2] << 16) + value[3] * 0x1000000 ^ 0xffffffff) + (value[4] ^ 0xff) * 0x100000000;
40 break;
41
42 case 6:
43 result = (value[0] + (value[1] << 8) + (value[2] << 16) + value[3] * 0x1000000 ^ 0xffffffff) + (value[4] + (value[5] << 8) ^ 0x0000ffff) * 0x100000000;
44 break;
45
46 default:
47 throw new Error('Value more than 48-bits cannot be reliably converted');
48 }
49
50 return result * -1 - 1;
51 }
52
53 switch (count) {
54 case 0:
55 return 0;
56
57 case 1:
58 return value[0];
59
60 case 2:
61 return value[0] + (value[1] << 8);
62
63 case 3:
64 return value[0] + (value[1] << 8) + (value[2] << 16);
65
66 case 4:
67 // for the 3rd byte, we don't << 24 - since JS converts all bitwise operators to
68 // 32-bit, in the case where the top-most bit is set this yields a negative value
69 return value[0] + (value[1] << 8) + (value[2] << 16) + value[3] * 0x1000000;
70
71 case 5:
72 return value[0] + (value[1] << 8) + (value[2] << 16) + (value[3] + (value[4] << 8)) * 0x1000000;
73
74 case 6:
75 return value[0] + (value[1] << 8) + (value[2] << 16) + (value[3] + (value[4] << 8) + (value[5] << 16)) * 0x1000000;
76
77 default:
78 throw new Error('Value more than 48-bits cannot be reliably converted');
79 }
80}
\No newline at end of file