@hashgraph/sdk
Version:
127 lines (113 loc) • 5.14 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.decode = decode;
exports.decodeFromByteString = decodeFromByteString;
exports.encode = encode;
exports.encodeToByteString = encodeToByteString;
exports.hexZeroPadded = hexZeroPadded;
exports.isHexString = isHexString;
// SPDX-License-Identifier: Apache-2.0
/**
* @type {string[]}
*/
const byteToHex = [];
/**
* @type {string[]}
*/
const byteToHexByteString = ["\x00", "\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08", "\x09", "\x0A", "\x0B", "\x0C", "\x0D", "\x0E", "\x0F", "\x10", "\x11", "\x12", "\x13", "\x14", "\x15", "\x16", "\x17", "\x18", "\x19", "\x1A", "\x1B", "\x1C", "\x1D", "\x1E", "\x1F", "\x20", "\x21", "\x22", "\x23", "\x24", "\x25", "\x26", "\x27", "\x28", "\x29", "\x2A", "\x2B", "\x2C", "\x2D", "\x2E", "\x2F", "\x30", "\x31", "\x32", "\x33", "\x34", "\x35", "\x36", "\x37", "\x38", "\x39", "\x3A", "\x3B", "\x3C", "\x3D", "\x3E", "\x3F", "\x40", "\x41", "\x42", "\x43", "\x44", "\x45", "\x46", "\x47", "\x48", "\x49", "\x4A", "\x4B", "\x4C", "\x4D", "\x4E", "\x4F", "\x50", "\x51", "\x52", "\x53", "\x54", "\x55", "\x56", "\x57", "\x58", "\x59", "\x5A", "\x5B", "\x5C", "\x5D", "\x5E", "\x5F", "\x60", "\x61", "\x62", "\x63", "\x64", "\x65", "\x66", "\x67", "\x68", "\x69", "\x6A", "\x6B", "\x6C", "\x6D", "\x6E", "\x6F", "\x70", "\x71", "\x72", "\x73", "\x74", "\x75", "\x76", "\x77", "\x78", "\x79", "\x7A", "\x7B", "\x7C", "\x7D", "\x7E", "\x7F", "\x80", "\x81", "\x82", "\x83", "\x84", "\x85", "\x86", "\x87", "\x88", "\x89", "\x8A", "\x8B", "\x8C", "\x8D", "\x8E", "\x8F", "\x90", "\x91", "\x92", "\x93", "\x94", "\x95", "\x96", "\x97", "\x98", "\x99", "\x9A", "\x9B", "\x9C", "\x9D", "\x9E", "\x9F", "\xA0", "\xA1", "\xA2", "\xA3", "\xA4", "\xA5", "\xA6", "\xA7", "\xA8", "\xA9", "\xAA", "\xAB", "\xAC", "\xAD", "\xAE", "\xAF", "\xB0", "\xB1", "\xB2", "\xB3", "\xB4", "\xB5", "\xB6", "\xB7", "\xB8", "\xB9", "\xBA", "\xBB", "\xBC", "\xBD", "\xBE", "\xBF", "\xC0", "\xC1", "\xC2", "\xC3", "\xC4", "\xC5", "\xC6", "\xC7", "\xC8", "\xC9", "\xCA", "\xCB", "\xCC", "\xCD", "\xCE", "\xCF", "\xD0", "\xD1", "\xD2", "\xD3", "\xD4", "\xD5", "\xD6", "\xD7", "\xD8", "\xD9", "\xDA", "\xDB", "\xDC", "\xDD", "\xDE", "\xDF", "\xE0", "\xE1", "\xE2", "\xE3", "\xE4", "\xE5", "\xE6", "\xE7", "\xE8", "\xE9", "\xEA", "\xEB", "\xEC", "\xED", "\xEE", "\xEF", "\xF0", "\xF1", "\xF2", "\xF3", "\xF4", "\xF5", "\xF6", "\xF7", "\xF8", "\xF9", "\xFA", "\xFB", "\xFC", "\xFD", "\xFE", "\xFF"];
for (let n = 0; n <= 0xff; n += 1) {
byteToHex.push(n.toString(16).padStart(2, "0"));
}
/**
* @param {Uint8Array} data
* @returns {string}
*/
function encode(data) {
let string = "";
for (const byte of data) {
string += byteToHex[byte];
}
return string;
}
/**
* @param {string} text
* @returns {Uint8Array}
*/
function decode(text) {
const str = text.startsWith("0x") ? text.substring(2) : text;
const result = str.match(/.{1,2}/gu);
return new Uint8Array((result == null ? [] : result).map(byte => parseInt(byte, 16)));
}
/**
* Check if a string is a valid hexadecimal string
* @param {string} text - The string to check
* @returns {boolean} - True if the string is a valid hex string, false otherwise
*/
function isHexString(text) {
if (typeof text !== "string") {
return false;
}
const str = text.startsWith("0x") ? text.substring(2) : text;
// Check if the string is empty after removing 0x prefix
if (str.length === 0) {
return false;
}
// Check if the string has even length (hex pairs)
if (str.length % 2 !== 0) {
return false;
}
// Check if all characters are valid hex digits
const hexRegex = /^[0-9a-fA-F]+$/;
return hexRegex.test(str);
}
/**
* @param {Uint8Array} data
* @returns {string}
*/
function encodeToByteString(data) {
let string = "";
for (const byte of data) {
string += byteToHexByteString[byte];
}
return string;
}
/**
* @param {string} text
* @returns {Uint8Array}
*/
function decodeFromByteString(text) {
const buffer = new Uint8Array(text.length);
const view = new DataView(buffer.buffer);
for (let i = 0; i < text.length; i++) {
view.setUint8(i, text.charCodeAt(i));
}
return buffer;
}
/**
* Encode with a specified length. Supports zero padding if the most significant byte is 0
*
* https://github.com/ethers-io/ethers.js/blob/master/packages/bytes/src.ts/index.ts#L315
*
* @param {Uint8Array} value
* @param {number} length
* @returns {string}
*/
function hexZeroPadded(value, length) {
const HexCharacters = "0123456789abcdef";
// https://github.com/ethers-io/ethers.js/blob/master/packages/bytes/src.ts/index.ts#L243
let result = "0x";
for (let i = 0; i < value.length; i++) {
let v = value[i];
result += HexCharacters[(v & 0xf0) >> 4] + HexCharacters[v & 0x0f];
}
// https://github.com/ethers-io/ethers.js/blob/master/packages/bytes/src.ts/index.ts#L315
if (result.length > 2 * length + 2) {
console.log("result out of range", "result");
}
while (result.length < 2 * length + 2) {
result = "0x0" + result.substring(2);
}
return result.substring(2);
}
;