You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.5 KiB
TypeScript
51 lines
1.5 KiB
TypeScript
/**
|
|
* Checks if a string is hex string. A hex string is a string like "0512ab".
|
|
* @param maybeHex the string to test
|
|
* @returns true if this string is a hex string.
|
|
*/
|
|
const isHexString = (maybeHex: string) =>
|
|
maybeHex.length !== 0 && maybeHex.length % 2 === 0 && !/[^a-fA-F0-9]/u.test(maybeHex);
|
|
|
|
/**
|
|
* Returns the Uint8Array corresponding to the given string.
|
|
* Note: this is different than the libsodium.from_hex().
|
|
* This takes a string like "0102" and converts it to an UInt8Array like [1, 2] where
|
|
* the libsodium one returns [0, 1, 0, 2]
|
|
*
|
|
* Throws an error if this string is not a hex string.
|
|
* @param hexString the string to convert from
|
|
* @returns the Uint8Array
|
|
*/
|
|
const fromHexString = (hexString: string): Uint8Array => {
|
|
if (!isHexString(hexString)) {
|
|
throw new Error('Not a hex string');
|
|
}
|
|
const matches = hexString.match(/.{1,2}/g);
|
|
if (!matches) {
|
|
return new Uint8Array();
|
|
}
|
|
return Uint8Array.from(matches.map(byte => parseInt(byte, 16)));
|
|
};
|
|
|
|
/**
|
|
* Returns the Uint8Array corresponding to the given string, without a 03/05 prefix when there is a prefix
|
|
* Note: this is different than the libsodium.from_hex().
|
|
*/
|
|
const fromHexStringNoPrefix = (hexString: string): Uint8Array => {
|
|
const asHex = fromHexString(hexString);
|
|
if (asHex.length === 33) {
|
|
return asHex.slice(1);
|
|
}
|
|
return asHex;
|
|
};
|
|
|
|
const toHexString = (bytes: Uint8Array) =>
|
|
bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '');
|
|
|
|
export const HexString = {
|
|
toHexString,
|
|
fromHexString,
|
|
fromHexStringNoPrefix,
|
|
isHexString,
|
|
};
|