|
|
'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; // 否则,直接返回原始数组
|
|
|
};
|
|
|
|