关于进制转换汇总
文章目录
- 关于进制转换,之前也小结了一些 戳我吧,最近开发 BLE 又重新整理了下。
10 进制 转 16 进制
const decimalToHex = (x) => {
x = parseInt(x, 10)
let hexStr = x.toString(16).toUpperCase();
if (hexStr.length % 2) hexStr = `0${hexStr}`;
return hexStr;
}
Demo
decimalToHex('20230521'); // 0134B179
16 进制 转 10 进制
const hexToDecimal = (x) => {
return parseInt(x, 16)
}
Demo
hexToDecimal('0x58') // 88
10 进制数组 转 16 进制
/**
* @param {*} arr
*/
const arrToHex = (arr) => {
return arr.reduce((accu, item) => {
let a = item.toString(16)
if (a.length < 2) a = `0${a}`
a = a.toUpperCase()
return accu += a
}, "")
}
Demo
let arr = [93, 53, 15, 10];
let res = arrToHex(arr); // 5D350F0A
16 进制 转 10 进制数组
/**
* @param {*} hex
* @param {*} size:默认2位
*/
const hexToArr = (hex, size = 2) => {
// hex字符串长度通常都是2的倍数,但为了放止意外,判断一下长度,不是2的倍数就在最前面补0
let trimStr = hex.trim();
let str = trimStr.substr(0, 2).toLowerCase() === "0x" ? trimStr.substr(2) : trimStr;
if (str.length % size) str = "0" + str
let arr = []
for (let i = 0; i < str.length; i += size) {
let a = parseInt(str.slice(i, i + size), 16)
arr.push(a)
}
return arr
}
Demo
let hex = '5D7B080A';
let res = hexToArr(hex); // [93, 123, 8, 10]
hexToArr('0E860EA4', 4); // [3718, 3748]
16进制数组 转 ASCII
/**
* @param {*} hexArr
*/
const hexArrToASCII = (hexArr) => {
let resultArr = [];
for (var i = 0; i < hexArr.length; i++) {
let toHex = hexArr[i].toString();
resultArr.push(String.fromCharCode(toHex));
}
let toStr = resultArr.join().replace(/,/g, "");
return toStr;
}
Demo
let hexArr = [0x41, 0x42, 0x43, 0x44, 0x45];
let res = hexArrToASCII(hexArr) // ABCDE
let decimalArr = [83, 109, 105, 108, 101, 46, 66, 76, 69, 32, 83, 116, 117, 100, 121];
let res = hexArrToASCII(decimalArr); // Smile.BLE Study
ASCII 转 16进制
/**
* @param {*} str
*/
const ASCIIToHex = (str) => {
if (str === "") return "";
let hexCharCode = [];
// hexCharCode.push("0x");
for (var i = 0; i < str.length; i++) {
hexCharCode.push((str.charCodeAt(i)).toString(16));
}
return hexCharCode.join("");
}
Demo
let str = 'Smile.BLE Study'
let res = ASCIIToHex(str); // 536d696c652e424c45205374756479
字符串格式 转 16进制
/**
* @param {*} str
* @param {*} size 默认2位
*/
const strToHex = (str, size = 2) => {
str = str.replace(/\s*/g, '');
if (str.length % size) str = `0${str}`;
let arr = []
for (let i = 0; i < str.length; i += size) {
let a = parseInt(str.slice(i, i + size), 10);
let hexStr = a.toString(16).toUpperCase();
if(hexStr.length < 2) hexStr = `0${hexStr}`
arr.push(hexStr)
}
return arr.join('')
}
Demo
let str = '20230520080910';
let res = strToHex(str); // 1417051408090A
16进制分割为数组格式
/**
* @param {*} str
* @param {*} size 默认2位
*/
const hexChunkToHexArr = (str, size = 2) => {
str = str.trim();
if (str.length % size) str = `0${str}`
let arr = []
for (let i = 0; i < str.length; i += size) {
let a = str.slice(i, i + size).toUpperCase();
arr.push(a)
}
return arr
}
Demo
let hex = '9903000064D6010F0A';
let res = hexChunkToHexArr(hex); // ['99', '03', '00', '00', '64', 'D6', '01', '0F', '0A']