JavaScript十进制数转十六进制 支持负数

606 阅读1分钟
  • 定义一个function
/**
 * 10进制转16进制
 * @param {*} val 10进制整数 
 * @param {*} signed 是否带有符号
 * @param {*} length 需要转换成多少字节的16进制数 
 * @returns 
 */
const parseHex = function(val, signed, length) {
    var num = parseInt(val);
    var hex_str = '';
    var hex_str_length = length * 2;//1个字节=2个16进制字符
    var min = 0;
    var max = 0;
    if (signed) { //带符号位
        min = -1 * Math.pow(2, 8 * length - 1);
        max = Math.pow(2, 8 * length - 1) - 1;
        if (num < min || num > max) { //数字超出转换范围
            // console.warn(`out of range,min is ${min},max is ${max},but val is ${num}.`)
        } else if (num < 0) { //传入合法负数
            //计算补码
            hex_str = (Math.pow(2, 8 * length) + num).toString(16);
            if (hex_str.length < hex_str_length) {
                hex_str = 'f'.repeat(hex_str_length - hex_str.length) + hex_str;
            }
        } else { //传入合法正数
            hex_str = num.toString(16);
            if (hex_str.length < hex_str_length) {
                hex_str = '0'.repeat(hex_str_length - hex_str.length) + hex_str;
            }
        }
    } else { //不带符号位
        min = 0;
        max = Math.pow(2, 8 * length) - 1;
        if (num < min || num > max) { //数字超出转换范围
            // console.warn(`out of range,min is ${min},max is ${max},but val is ${num}.`)
        } else { //传入合法正数
            hex_str = num.toString(16);
            if (hex_str.length < hex_str_length) {
                hex_str = '0'.repeat(hex_str_length - hex_str.length) + hex_str;
            }
        }
    }
    return hex_str
};
  • 调用该函数
    • parseHex(-65536,true,4); // 结果为'ffff0000' 前两位表示正负 可只取后六位 ff0000