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.
150 lines
3.6 KiB
150 lines
3.6 KiB
|
4 years ago
|
|
||
|
|
var hexStringToBytes = function (hexString: string | null) {
|
||
|
|
if (hexString == null || hexString == "") {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
hexString = hexString.toUpperCase();
|
||
|
|
let Length = hexString.length / 2;
|
||
|
|
let hexChars = stringToByte(hexString);
|
||
|
|
let d = [];
|
||
|
|
for (let i = 0; i < Length; i++) {
|
||
|
|
let pos = i * 2;
|
||
|
|
let a = charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]);
|
||
|
|
d.push(a);
|
||
|
|
}
|
||
|
|
return d;
|
||
|
|
};
|
||
|
|
|
||
|
|
var charToByte = function (c: any) {
|
||
|
|
let a = String.fromCharCode(c).toUpperCase();
|
||
|
|
return "0123456789ABCDEF".indexOf(a);
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
var bytesToHexString = function (src: any) {
|
||
|
|
let d = "";
|
||
|
|
if (src == null || src.length <= 0) {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
for (let i = 0; i < src.length; i++) {
|
||
|
|
let v = src[i] & 0xFF;
|
||
|
|
let hv = intTo16value(v);
|
||
|
|
d += hv;
|
||
|
|
}
|
||
|
|
return d
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 将字符串转化成byte数组
|
||
|
|
* @param {字符串} str
|
||
|
|
*/
|
||
|
|
var stringToByte = function (str) {
|
||
|
|
var bytes = new Array();
|
||
|
|
var len, c;
|
||
|
|
len = str.length;
|
||
|
|
for (var i = 0; i < len; i++) {
|
||
|
|
c = str.charCodeAt(i);
|
||
|
|
if (c >= 0x010000 && c <= 0x10FFFF) {
|
||
|
|
bytes.push(((c >> 18) & 0x07) | 0xF0);
|
||
|
|
bytes.push(((c >> 12) & 0x3F) | 0x80);
|
||
|
|
bytes.push(((c >> 6) & 0x3F) | 0x80);
|
||
|
|
bytes.push((c & 0x3F) | 0x80);
|
||
|
|
} else if (c >= 0x000800 && c <= 0x00FFFF) {
|
||
|
|
bytes.push(((c >> 12) & 0x0F) | 0xE0);
|
||
|
|
bytes.push(((c >> 6) & 0x3F) | 0x80);
|
||
|
|
bytes.push((c & 0x3F) | 0x80);
|
||
|
|
} else if (c >= 0x000080 && c <= 0x0007FF) {
|
||
|
|
bytes.push(((c >> 6) & 0x1F) | 0xC0);
|
||
|
|
bytes.push((c & 0x3F) | 0x80);
|
||
|
|
} else {
|
||
|
|
bytes.push(c & 0xFF);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return bytes;
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 将数组转变成字符串
|
||
|
|
* @param {byte数组} arr
|
||
|
|
*/
|
||
|
|
var byteToString = function (arr) {
|
||
|
|
if (typeof arr === 'string') {
|
||
|
|
return arr;
|
||
|
|
}
|
||
|
|
var str = '',
|
||
|
|
_arr = arr;
|
||
|
|
for (var i = 0; i < _arr.length; i++) {
|
||
|
|
var one = _arr[i].toString(2),
|
||
|
|
v = one.match(/^1+?(?=0)/);
|
||
|
|
if (v && one.length == 8) {
|
||
|
|
var bytesLength = v[0].length;
|
||
|
|
var store = _arr[i].toString(2).slice(7 - bytesLength);
|
||
|
|
for (var st = 1; st < bytesLength; st++) {
|
||
|
|
store += _arr[st + i].toString(2).slice(2);
|
||
|
|
}
|
||
|
|
str += String.fromCharCode(parseInt(store, 2));
|
||
|
|
i += bytesLength - 1;
|
||
|
|
} else {
|
||
|
|
str += String.fromCharCode(_arr[i]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return str;
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 字符串转Ascii
|
||
|
|
* @param {*} strLine
|
||
|
|
*/
|
||
|
|
var stringToAscii = function (strLine) {
|
||
|
|
let lineArr = stringToByte(strLine)
|
||
|
|
let __strLine = '';
|
||
|
|
for (var i = 0; i < lineArr.length; i++) {
|
||
|
|
|
||
|
|
__strLine += intTo16value(lineArr[i]);
|
||
|
|
}
|
||
|
|
|
||
|
|
return __strLine;
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 10进制转16进制
|
||
|
|
* @param {*} data
|
||
|
|
*/
|
||
|
|
var intTo16value = function (data) {
|
||
|
|
return data.toString(16).toUpperCase().PadLeft(2, '0');
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 10进制转16进制
|
||
|
|
* @param {*} data
|
||
|
|
* @param {*} len
|
||
|
|
*/
|
||
|
|
var intToHex = function (data, len) {
|
||
|
|
let intData = parseInt(data);
|
||
|
|
return intData.toString(16).toUpperCase().PadLeft(len, '0');
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* DateTime时间格式转换为8位不带毫秒的Unix时间戳
|
||
|
|
* @param {*} time
|
||
|
|
* @returns
|
||
|
|
*/
|
||
|
|
var convertDateTimeHex = function (time) {
|
||
|
|
var timestamp = Date.parse(time) / 1000;
|
||
|
|
return intToHex(timestamp, 8);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 发布模块
|
||
|
|
*/
|
||
|
|
module.exports = {
|
||
|
|
HexStringToBytes: hexStringToBytes,
|
||
|
|
BytesToHexString: bytesToHexString,
|
||
|
|
ByteToString: byteToString,
|
||
|
|
StringToAscii: stringToAscii,
|
||
|
|
IntToHex: intToHex,
|
||
|
|
ConvertDateTimeHex: convertDateTimeHex
|
||
|
|
}
|