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("
");
}
 
function FormatHexBatch(t, n, ie) {
    var a = t.split("
");
    var r = new Array();
    for(var i = 0; i < a.length; i++) {
        r[i] = FormatHex(a[i], n, ie);
    }
    return r.join("
");
}
 
function HexToSingleBatch(t) {
    var a = FormatHexBatch(t, 8, true).split("
");
    var r = new Array();
    for(var i = 0; i < a.length; i++) {
        r[i] = HexToSingle(a[i]);
    }
    return r.join("
");
}
 
function SingleToHexBatch(t) {
    var a = t.split("
");
    var r = new Array();
    for(var i = 0; i < a.length; i++) {
        r[i] = SingleToHex(a[i]);
    }
    return r.join("
");
}

使用方法:

//十六进制字符串转浮点

HexToSingle(str)

//浮点转十六进制字符串

SingleToHex(str)

原文地址:https://www.cnblogs.com/zhouheblog/p/13578012.html