Hex.js
1.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import { Word32Array } from "../Word32Array";
export const Hex = {
/**
* Converts a word array to a hex string.
*
* @param {Word32Array} w An array of 32-bit words.
* @return {string} The hex string.
* @example
* var hexString = Hex.stringify(new Word32Array([0x293892], 6));
*/
stringify(w) {
const nSig = w.nSigBytes;
const words = w.words;
const hexChars = [];
for (let i = 0; i < nSig; i++) {
const byte = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
hexChars.push((byte >>> 4).toString(16));
hexChars.push((byte & 0x0f).toString(16));
}
return hexChars.join("");
},
/**
* Converts a hex string to a word array.
*
* @param {string} hexStr The hex string.
* @return {Word32Array} The word array.
* @example
* var wordArray = Hex.parse(hexString);
*/
parse(hexStr) {
const Len = hexStr.length;
if (Len % 2 !== 0) {
throw new Error("Hex string count must be even");
}
else if (!/^[a-fA-F0-9]+$/.test(hexStr)) {
throw new Error(`Invalid Hex string: ${hexStr}`);
}
const words = [];
for (let i = 0; i < Len; i += 2) {
words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);
}
return new Word32Array(words, Len / 2);
}
};