js中hex各种转换总结
包含int和hex互转,hex和double、float互转,string和hex转换
var HEX = {};
/**
* @param {Object} buffer
* ArrayBuffer转16进制字符串
*/
HEX.ab2hex = function(buffer) {
const hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function(bit) {
return ('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join('')
}
//int转hex
HEX.intTohex = function(data, len) {
// console.log(data);
len = len * 2;
var retVal = data.toString(16);
//console.log(retVal);
if (retVal.length > len) return retVal;
var length = retVal.length;
for (var i = 0; i < len - length; i++) {
retVal = '0' + retVal;
}
return retVal;
}
//需要用到的函数
HEX.InsertString = function(t, c, n) {
var r = new Array();
for (var i = 0; i * 2 < t.length; i++) {
r.push(t.substr(i * 2, n));
}
return r.join(c);
}
//需要用到的函数
HEX.FillString = function(t, c, n, b) {
if ((t == "") || (c.length != 1) || (n <= t.length)) {
return t;
}
var l = t.length;
for (var i = 0; i < n - l; i++) {
if (b == true) {
t = c + t;
} else {
t += c;
}
}
return t;
}
//16进制转双精度浮点数
HEX.HexToDouble = function(temp) {
let ret=''
for(let i=0;i<temp.length;i=i+2){
ret=temp.substr(i,2)+ret;
}
temp=ret;
let S_Bin = ""; //转化后的二进制字符串
for (let i = 0; i < temp.length; i++) {
let temp1 = temp.charAt(i);
S_Bin = S_Bin + HEX.charToBin(temp1);
}
let sign = 0; //符号位
if (S_Bin.charAt(0) == '1') {
sign = 1;
}
let exponent = "";
for (let i = 1; i < 12; i++) {
if (S_Bin.charAt(i) == '1') {
exponent = exponent + '1';
} else
exponent = exponent + '0';
}
let exponent_double = 0; //阶码
exponent_double = HEX.stringToDouble(exponent);
exponent_double = exponent_double - 1023;
let mantissa_temp = "";
for (let i = 12; i < 64; i++) {
if (S_Bin.charAt(i) == '1') {
mantissa_temp = mantissa_temp + '1';
} else
mantissa_temp = mantissa_temp + '0';
}
let mantissa = 0;
mantissa = HEX.BenToDex(mantissa_temp);
mantissa = mantissa + 1.0;
let res = 0;
let a, c;
a = Math.pow((-1), sign);
c = Math.pow(2, exponent_double);
res = a * mantissa * c;
return res;
}
HEX.charToBin = function(temp) {
return HEX.FillString(parseInt(temp, 16).toString(2), '0', 4, true);
}
HEX.stringToDouble = function(temp) {
let res = 0;
for (let i = 0; i < temp.length; i++) {
res = res * 2 + (temp[i] - '0');
}
return res;
}
HEX.BenToDex = function(temp) {
let m = temp.length;
let res = 0;
for (let i = 0; i < m; i++) {
res = res + (temp[i] - '0') * Math.pow(2, -i - 1);
}
return res;
}
//16进制转单精度浮点数
HEX.HexToSingle = function(t) {
t = t.replace(/\s+/g, "");
if (t == "") {
return 0;
}
if (t == "00000000") {
return 0;
}
if ((t.length > 8) || (isNaN(parseInt(t, 16)))) {
return "Error";
}
if (t.length < 8) {
t = HEX.FillString(t, "0", 8, true);
}
t = parseInt(t, 16).toString(2);
t = HEX.FillString(t, "0", 32, true);
var s = t.substring(0, 1);
var e = t.substring(1, 9);
var m = t.substring(9);
e = parseInt(e, 2) - 127;
m = "1" + m;
if (e >= 0) {
m = m.substr(0, e + 1) + "." + m.substring(e + 1)
} else {
m = "0." + HEX.FillString(m, "0", m.length - e - 1, true)
}
if (m.indexOf(".") == -1) {
m = m + ".0";
}
var a = m.split(".");
var mi = parseInt(a[0], 2);
var mf = 0;
for (var i = 0; i < a[1].length; i++) {
mf += parseFloat(a[1].charAt(i)) * Math.pow(2, -(i + 1));
}
m = parseInt(mi) + parseFloat(mf);
if (s == 1) {
m = 0 - m;
}
return m;
}
//浮点数转16进制
HEX.SingleToHex = function(t) {
if (t == "") {
return "";
}
//console.log(t);
t = parseFloat(t);
//console.log(t);
if (isNaN(t) == true) {
return "Error";
}
if (t == 0) {
return "00000000";
}
var s,
e,
m;
if (t > 0) {
s = 0;
} else {
s = 1;
t = 0 - t;
}
m = t.toString(2);
if (m >= 1) {
if (m.indexOf(".") == -1) {
m = m + ".0";
}
e = m.indexOf(".") - 1;
} else {
e = 1 - m.indexOf("1");
}
if (e >= 0) {
m = m.replace(".", "");
} else {
m = m.substring(m.indexOf("1"));
}
if (m.length > 24) {
m = m.substr(0, 24);
} else {
m = HEX.FillString(m, "0", 24, false)
}
m = m.substring(1);
e = (e + 127).toString(2);
e = HEX.FillString(e, "0", 8, true);
var r = parseInt(s + e + m, 2).toString(16);
r = HEX.FillString(r, "0", 8, true);
return HEX.InsertString(r, "", 2).toUpperCase();
}
HEX.stringToHex = function(str) {
var val = "";
for (var i = 0; i < str.length; i++) {
if (val == "")
val = str.charCodeAt(i).toString(16);
else
val += str.charCodeAt(i).toString(16);
}
return val;
}
HEX.hexToString = function(hexCharCodeStr) {
var trimedStr = hexCharCodeStr.trim();
var rawStr =
trimedStr.substr(0, 2).toLowerCase() === "0x" ?
trimedStr.substr(2) :
trimedStr;
var len = rawStr.length;
if (len % 2 !== 0) {
alert("Illegal Format ASCII Code!");
return "";
}
var curCharCode;
var resultStr = [];
for (var i = 0; i < len; i = i + 2) {
if (rawStr.substr(i, 2) == '00') {
resultStr.push('');
} else {
curCharCode = parseInt(rawStr.substr(i, 2), 16); // ASCII Code Value
resultStr.push(String.fromCharCode(curCharCode));
}
}
return resultStr.join("");
}
HEX.add0 = function(m) {
return m < 10 ? '0' + m : m
}
export default HEX;
CRC
一个是ToCRC16,一个是ToModbusCRC16
var CRC = {};
CRC.CRC16 = function (data) {
var len = data.length;
if (len > 0) {
var crc = 0xFFFF;
for (var i = 0; i < len; i++) {
crc = (crc ^ (data[i]));
for (var j = 0; j < 8; j++) {
crc = (crc & 1) != 0 ? ((crc >> 1) ^ 0xA001) : (crc >> 1);
}
}
var hi = ((crc & 0xFF00) >> 8); //高位置
var lo = (crc & 0x00FF); //低位置
return [hi, lo];
}
return [0, 0];
};
CRC.isArray = function (arr) {
return Object.prototype.toString.call(arr) === '[object Array]';
};
CRC.ToCRC16 = function (str, isReverse) {
return CRC.toString(CRC.CRC16(CRC.isArray(str) ? str : CRC.strToByte(str)), isReverse);
};
CRC.ToModbusCRC16 = function (str, isReverse) {
return CRC.toString(CRC.CRC16(CRC.isArray(str) ? str : CRC.strToHex(str)), isReverse);
};
CRC.strToByte = function (str) {
var tmp = str.split(''), arr = [];
for (var i = 0, c = tmp.length; i < c; i++) {
var j = encodeURI(tmp[i]);
if (j.length == 1) {
arr.push(j.charCodeAt());
} else {
var b = j.split('%');
for (var m = 1; m < b.length; m++) {
arr.push(parseInt('0x' + b[m]));
}
}
}
return arr;
};
CRC.convertChinese = function (str) {
var tmp = str.split(''), arr = [];
for (var i = 0, c = tmp.length; i < c; i++) {
var s = tmp[i].charCodeAt();
if (s <= 0 || s >= 127) {
arr.push(s.toString(16));
}
else {
arr.push(tmp[i]);
}
}
return arr;
};
CRC.filterChinese = function (str) {
var tmp = str.split(''), arr = [];
for (var i = 0, c = tmp.length; i < c; i++) {
var s = tmp[i].charCodeAt();
if (s > 0 && s < 127) {
arr.push(tmp[i]);
}
}
return arr;
};
CRC.strToHex = function (hex, isFilterChinese) {
hex = isFilterChinese ? CRC.filterChinese(hex).join('') : CRC.convertChinese(hex).join('');
//清除所有空格
hex = hex.replace(/\s/g, "");
//若字符个数为奇数,补一个0
hex += hex.length % 2 != 0 ? "0" : "";
var c = hex.length / 2, arr = [];
for (var i = 0; i < c; i++) {
arr.push(parseInt(hex.substr(i * 2, 2), 16));
}
return arr;
};
CRC.padLeft = function (s, w, pc) {
if (pc == undefined) {
pc = '0';
}
for (var i = 0, c = w - s.length; i < c; i++) {
s = pc + s;
}
return s;
};
CRC.toString = function (arr, isReverse) {
if (typeof isReverse == 'undefined') {
isReverse = true;
}
var hi = arr[0], lo = arr[1];
return CRC.padLeft((isReverse ? hi + lo * 0x100 : hi * 0x100 + lo).toString(16).toUpperCase(), 4, '0');
};
export default CRC;