JAVASCRIPT 對有符號整型、無符號整型、浮點型、十六進制、二進制的數據處理

本文代碼全部收集整理於各大論壇

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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章