You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
blockvote/node_modules/minimalistic-crypto-utils/lib/utils.js

85 lines
3.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

'use strict';
var utils = exports; // 导出一个 utils 对象,使得该对象的功能可以被外部访问和使用
// toArray: 将输入的 msg 转换为一个数组,支持不同类型的编码
function toArray(msg, enc) {
// 如果 msg 已经是一个数组,返回其副本
if (Array.isArray(msg))
return msg.slice();
// 如果 msg 是 null 或 undefined返回一个空数组
if (!msg)
return [];
var res = []; // 用于存放转换后的结果数组
// 如果 msg 不是字符串,则将其视为类数组对象,逐个元素转换为整数并存入 res 数组
if (typeof msg !== 'string') {
for (var i = 0; i < msg.length; i++)
res[i] = msg[i] | 0; // 使用按位 OR 操作将每个元素转换为数字类型
return res;
}
// 如果 msg 是字符串,并且编码方式是 'hex'(十六进制)
if (enc === 'hex') {
// 去除字符串中的所有非字母和数字字符(忽略大小写)
msg = msg.replace(/[^a-z0-9]+/ig, '');
// 如果 msg 的长度是奇数,补充一个 '0' 在前面,确保可以按两位一组处理
if (msg.length % 2 !== 0)
msg = '0' + msg;
// 每两位字符组成一个字节16 进制),将其转换为十进制并推入结果数组
for (var i = 0; i < msg.length; i += 2)
res.push(parseInt(msg[i] + msg[i + 1], 16)); // 将两个十六进制字符组合成一个字节(数字)
} else {
// 如果 msg 是普通的字符串,按 UTF-16 编码将每个字符转换为数字
for (var i = 0; i < msg.length; i++) {
var c = msg.charCodeAt(i); // 获取字符的 UTF-16 编码
var hi = c >> 8; // 获取字符的高字节
var lo = c & 0xff; // 获取字符的低字节
// 如果字符编码大于 255即有高字节将高字节和低字节都存入结果数组
if (hi)
res.push(hi, lo);
else
res.push(lo); // 如果字符编码小于或等于 255只存入低字节
}
}
return res; // 返回转换后的数组
}
utils.toArray = toArray; // 将 toArray 函数赋值给 utils 对象,供外部调用
// zero2: 确保输入字符串长度为两位数,不足时前面补零
function zero2(word) {
// 如果输入的字符串长度为 1前面补充一个 '0'
if (word.length === 1)
return '0' + word;
else
return word; // 如果已是两位数,则返回原字符串
}
utils.zero2 = zero2; // 将 zero2 函数赋值给 utils 对象,供外部调用
// toHex: 将数字数组转换为十六进制字符串,每个数字转换为两位的十六进制字符串
function toHex(msg) {
var res = ''; // 用于存放最终的十六进制字符串
// 遍历输入的数组,将每个数字转换为十六进制并拼接成字符串
for (var i = 0; i < msg.length; i++)
res += zero2(msg[i].toString(16)); // 每个数字转换为十六进制并加上前导零(如果需要)
return res; // 返回拼接后的十六进制字符串
}
utils.toHex = toHex; // 将 toHex 函数赋值给 utils 对象,供外部调用
// encode: 根据指定的编码方式将数组进行编码,如果是 'hex',则将其转换为十六进制字符串
utils.encode = function encode(arr, enc) {
if (enc === 'hex')
return toHex(arr); // 如果编码方式是 'hex',则调用 toHex 函数进行转换
else
return arr; // 否则,直接返回原始数组
};