1.十六进制字符串转有符号整型,支持S8、S16、S32:
function hexToInt(hex) { if(hex.length % 2 != 0) { hex = "0" + hex; } var num = parseInt(hex, 16); var maxVal = Math.pow(2, hex.length / 2 * 8); if(num > maxVal / 2 - 1) { num = num - maxVal } return num; }
2.十六进制字符串转无符号整型,支持U8、U16、U32:
parseInt(str,16);
3.十六进制字符串转有/无符号64位整型,支持S64、U64:
function HexStringToInt64StringConverter(signed) { var hexCode = { '0': "0000", '1': "0001", '2': "0010", '3': "0011", '4': "0100", '5': "0101", '6': "0110", '7': "0111", '8': "1000", '9': "1001", 'a': "1010", 'b': "1011", 'c': "1100", 'd': "1101", 'e': "1110", 'f': "1111" }; var preComputedLongMath = { "20": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], "21": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2], "22": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4], "23": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8], "24": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6], "25": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2], "26": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 4], "27": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 8], "28": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 6], "29": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 2], "210": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 4], "211": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 8], "212": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 9, 6], "213": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 1, 9, 2], "214": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6, 3, 8, 4], "215": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 7, 6, 8], "216": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 5, 5, 3, 6], "217": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 1, 0, 7, 2], "218": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6, 2, 1, 4, 4], "219": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 2, 4, 2, 8, 8], "220": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 8, 5, 7, 6], "221": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 9, 7, 1, 5, 2], "222": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 9, 4, 3, 0, 4], "223": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 3, 8, 8, 6, 0, 8], "224": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6, 7, 7, 7, 2, 1, 6], "225": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 5, 5, 4, 4, 3, 2], "226": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 1, 0, 8, 8, 6, 4], "227": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 4, 2, 1, 7, 7, 2, 8], "228": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6, 8, 4, 3, 5, 4, 5, 6], "229": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 3, 6, 8, 7, 0, 9, 1, 2], "230": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 3, 7, 4, 1, 8, 2, 4], "231": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 4, 7, 4, 8, 3, 6, 4, 8], "232": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 9, 4, 9, 6, 7, 2, 9, 6], "233": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 5, 8, 9, 9, 3, 4, 5, 9, 2], "234": [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7, 1, 7, 9, 8, 6, 9, 1, 8, 4], "235": [0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 3, 5, 9, 7, 3, 8, 3, 6, 8], "236": [0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, 7, 1, 9, 4, 7, 6, 7, 3, 6], "237": [0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 7, 4, 3, 8, 9, 5, 3, 4, 7, 2], "238": [0, 0, 0, 0, 0, 0, 0, 0, 2, 7, 4, 8, 7, 7, 9, 0, 6, 9, 4, 4], "239": [0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 9, 7, 5, 5, 8, 1, 3, 8, 8, 8], "240": [0, 0, 0, 0, 0, 0, 0, 1, 0, 9, 9, 5, 1, 1, 6, 2, 7, 7, 7, 6], "241": [0, 0, 0, 0, 0, 0, 0, 2, 1, 9, 9, 0, 2, 3, 2, 5, 5, 5, 5, 2], "242": [0, 0, 0, 0, 0, 0, 0, 4, 3, 9, 8, 0, 4, 6, 5, 1, 1, 1, 0, 4], "243": [0, 0, 0, 0, 0, 0, 0, 8, 7, 9, 6, 0, 9, 3, 0, 2, 2, 2, 0, 8], "244": [0, 0, 0, 0, 0, 0, 1, 7, 5, 9, 2, 1, 8, 6, 0, 4, 4, 4, 1, 6], "245": [0, 0, 0, 0, 0, 0, 3, 5, 1, 8, 4, 3, 7, 2, 0, 8, 8, 8, 3, 2], "246": [0, 0, 0, 0, 0, 0, 7, 0, 3, 6, 8, 7, 4, 4, 1, 7, 7, 6, 6, 4], "247": [0, 0, 0, 0, 0, 1, 4, 0, 7, 3, 7, 4, 8, 8, 3, 5, 5, 3, 2, 8], "248": [0, 0, 0, 0, 0, 2, 8, 1, 4, 7, 4, 9, 7, 6, 7, 1, 0, 6, 5, 6], "249": [0, 0, 0, 0, 0, 5, 6, 2, 9, 4, 9, 9, 5, 3, 4, 2, 1, 3, 1, 2], "250": [0, 0, 0, 0, 1, 1, 2, 5, 8, 9, 9, 9, 0, 6, 8, 4, 2, 6, 2, 4], "251": [0, 0, 0, 0, 2, 2, 5, 1, 7, 9, 9, 8, 1, 3, 6, 8, 5, 2, 4, 8], "252": [0, 0, 0, 0, 4, 5, 0, 3, 5, 9, 9, 6, 2, 7, 3, 7, 0, 4, 9, 6], "253": [0, 0, 0, 0, 9, 0, 0, 7, 1, 9, 9, 2, 5, 4, 7, 4, 0, 9, 9, 2], "254": [0, 0, 0, 1, 8, 0, 1, 4, 3, 9, 8, 5, 0, 9, 4, 8, 1, 9, 8, 4], "255": [0, 0, 0, 3, 6, 0, 2, 8, 7, 9, 7, 0, 1, 8, 9, 6, 3, 9, 6, 8], "256": [0, 0, 0, 7, 2, 0, 5, 7, 5, 9, 4, 0, 3, 7, 9, 2, 7, 9, 3, 6], "257": [0, 0, 1, 4, 4, 1, 1, 5, 1, 8, 8, 0, 7, 5, 8, 5, 5, 8, 7, 2], "258": [0, 0, 2, 8, 8, 2, 3, 0, 3, 7, 6, 1, 5, 1, 7, 1, 1, 7, 4, 4], "259": [0, 0, 5, 7, 6, 4, 6, 0, 7, 5, 2, 3, 0, 3, 4, 2, 3, 4, 8, 8], "260": [0, 1, 1, 5, 2, 9, 2, 1, 5, 0, 4, 6, 0, 6, 8, 4, 6, 9, 7, 6], "261": [0, 2, 3, 0, 5, 8, 4, 3, 0, 0, 9, 2, 1, 3, 6, 9, 3, 9, 5, 2], "262": [0, 4, 6, 1, 1, 6, 8, 6, 0, 1, 8, 4, 2, 7, 3, 8, 7, 9, 0, 4], "263": [0, 9, 2, 2, 3, 3, 7, 2, 0, 3, 6, 8, 5, 4, 7, 7, 5, 8, 0, 8], "264": [1, 8, 4, 4, 6, 7, 4, 4, 0, 7, 3, 7, 0, 9, 5, 5, 1, 6, 1, 6], "265": [3, 6, 8, 9, 3, 4, 8, 8, 1, 4, 7, 4, 1, 9, 1, 0, 3, 2, 3, 2] }; if(typeof(signed) != 'boolean') signed = false; function toBinary(hex) { hex = hex.toLowerCase(); var binary = ""; for(var i = 0; i < hex.length; i++) { binary += hexCode[hex[i]]; } return binary; } function to1nsComplement(binary) { var compliment = ""; for(var i = 0; i < binary.length; i++) { compliment += (binary.charAt(i) == "1" ? "0" : "1"); } return compliment; } function arrayAdd(a, b) { var carry = 0; var number = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; for(var i = 19; i >= 0; i--) { number[i] = a[i] + b[i] + carry; if(number[i].toString().length > 1) { carry = parseInt(number[i].toString().substring(0, number[i].toString().length - 1), 10); number[i] = parseInt(number[i].toString().substring(number[i].toString().length - 1), 10) } else { carry = 0; } } return number; } function removeZeroPad(number) { var lock = false; var output = []; for(var i = 0; i < number.length; i++) { if(lock) { output.push(number[i]); } else { if(number[i] != 0) { lock = true; output.push(number[i]); } } } return output; } function binaryToDec(binary) { var negative = false; if(signed && (binary.charAt(0) == 1)) { negative = true; } if(signed) { binary = binary.substring(1); if(negative) { binary = to1nsComplement(binary); } } var pos = 0; var number = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; for(var i = binary.length - 1; i >= 0; i--) { if(binary.charAt(i) == 1) { number = arrayAdd(number, preComputedLongMath["2" + pos]) } pos++; } if(negative) { number = removeZeroPad(arrayAdd(number, preComputedLongMath["20"])); number.splice(0, 0, "-"); } else { number = removeZeroPad(number); } return number.join(""); } this.convert = function(hex) { var binary = toBinary(hex); return binaryToDec(binary); }; }
使用方法:
lid64 = new HexStringToInt64StringConverter(true).convert(str);
//true为有符号、false为无符号,str为十六进制字符串
4.二进制字符串与十六进制字符串相互转换:
//二进制转十六进制 function bin_to_hex(str) { let hex_array = [{ key: 0, val: "0000" }, { key: 1, val: "0001" }, { key: 2, val: "0010" }, { key: 3, val: "0011" }, { key: 4, val: "0100" }, { key: 5, val: "0101" }, { key: 6, val: "0110" }, { key: 7, val: "0111" }, { key: 8, val: "1000" }, { key: 9, val: "1001" }, { key: 'a', val: "1010" }, { key: 'b', val: "1011" }, { key: 'c', val: "1100" }, { key: 'd', val: "1101" }, { key: 'e', val: "1110" }, { key: 'f', val: "1111" } ] let value = '' let list = [] //console.log(str) if(str.length % 4 !== 0) { let a = "0000" let b = a.substring(0, 4 - str.length % 4) str = b.concat(str) } //console.log(str) while(str.length > 4) { list.push(str.substring(0, 4)) str = str.substring(4); } list.push(str) //console.log(list) for(let i = 0; i < list.length; i++) { for(let j = 0; j < hex_array.length; j++) { if(list[i] == hex_array[j].val) { value = value.concat(hex_array[j].key) break } } } //console.log(value) return value } //十六进制转二进制 function hex_to_bin(str) { let hex_array = [{ key: 0, val: "0000" }, { key: 1, val: "0001" }, { key: 2, val: "0010" }, { key: 3, val: "0011" }, { key: 4, val: "0100" }, { key: 5, val: "0101" }, { key: 6, val: "0110" }, { key: 7, val: "0111" }, { key: 8, val: "1000" }, { key: 9, val: "1001" }, { key: 'a', val: "1010" }, { key: 'b', val: "1011" }, { key: 'c', val: "1100" }, { key: 'd', val: "1101" }, { key: 'e', val: "1110" }, { key: 'f', val: "1111" } ] let value = "" for(let i = 0; i < str.length; i++) { for(let j = 0; j < hex_array.length; j++) { if(str.charAt(i) == hex_array[j].key) { value = value.concat(hex_array[j].val) break } } } //console.log(value) return value }
5.十六进制字符串与FLOAT互转
function InsertString(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); } function FillString(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; } function HexToSingle(t) { t = t.replace(/\s+/g, ""); if(t == "") { return ""; } if(t == "00000000") { return "0"; } if((t.length > 8) || (isNaN(parseInt(t, 16)))) { return "Error"; } if(t.length < 8) { t = FillString(t, "0", 8, true); } t = parseInt(t, 16).toString(2); t = 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." + 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; } function SingleToHex(t) { if(t == "") { return ""; } t = parseFloat(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 = FillString(m, "0", 24, false) } m = m.substring(1); e = (e + 127).toString(2); e = FillString(e, "0", 8, true); var r = parseInt(s + e + m, 2).toString(16); r = FillString(r, "0", 8, true); return InsertString(r, " ", 2).toUpperCase(); } function FormatHex(t, n, ie) { var r = new Array(); var s = ""; var c = 0; for(var i = 0; i < t.length; i++) { if(t.charAt(i) != " ") { s += t.charAt(i); c += 1; if(c == n) { r.push(s); s = ""; c = 0; } } if(ie == false) { if((i == t.length - 1) && (s != "")) { r.push(s); } } } return r.join("\n"); } function FormatHexBatch(t, n, ie) { var a = t.split("\n"); var r = new Array(); for(var i = 0; i < a.length; i++) { r[i] = FormatHex(a[i], n, ie); } return r.join("\n"); } function HexToSingleBatch(t) { var a = FormatHexBatch(t, 8, true).split("\n"); var r = new Array(); for(var i = 0; i < a.length; i++) { r[i] = HexToSingle(a[i]); } return r.join("\r\n"); } function SingleToHexBatch(t) { var a = t.split("\n"); var r = new Array(); for(var i = 0; i < a.length; i++) { r[i] = SingleToHex(a[i]); } return r.join("\r\n"); }
使用方法:
//十六进制字符串转浮点
HexToSingle(str)
//浮点转十六进制字符串
SingleToHex(str)